day10 递归

死循环,因此递归必须要定义一个明确的结束条件
1 def calc(n):
2     print(n)
3     calc(n)
4 calc(10)
return 表示终止符号,最终会得出一个确切的返回值,且可以赋值
1 def calc(n):
2     print(n)
3     if    int(n/2) == 0:
4         return n
5     return calc(int(n/2))
6 
7 a = calc(10)
8 print(a)
总结:
递归即函数调用自己
递归不能死循环,真的会死的
递归每次进入更深一层的时候,必须要规模减少
递归的效率很低,当前层在调用下一层的时候,要停滞当前层且保存当前层的状态等待下一层的计算返回值,
倘若下一层继续调用下下一层同理,会无限循环保存导致栈溢出甚至内存不足


正确的递归
1 def num (n):
2     print(n)
3     if  int(n/2) == 0:
4         return n
5     return num(int(n/2))
6 a = num(10)
7 print(a)


ps:小练习
斐波那契数列 第n个数字是多少
 1 # 1,1,2,3,5,8,13,21.....
 2 # fib(6) = fib(5) + fib(4)
 3 # fib(5) = fib(4) + fib(3)
 4 # fib(4) = fib(3) + fib(2)
 5 # fib(3) = fib(2) + fib(1)
 6 # fib(2) = 1
 7 # fib(1) = 1
 8 
 9 # 双递归,非常费劲
10 def fib(n):
11     if    n == 1 or n == 2:
12         return 1
13     return fib(n-1) +fib(n-2)
14 print(fib(40))
大练习 问路递归练习
 1 import time
 2 
 3 person_list=['alex','wupeiqi','linhaifeng','zsc',"yangtuo"]
 4 def ask_way(person_list):
 5     print('-'*60)
 6     if len(person_list) == 0:
 7         return '根本没人知道'
 8     person=person_list.pop(0)
 9     if person == 'linhaifeng':
10         return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
11 
12     print('hi 美男[%s],敢问路在何方' % person)
13     print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list))
14     time.sleep(5)
15     res=ask_way(person_list)
16 
17 
18     print('%s问的结果是: %res' %(person,res))
19     return res
20 
21 res=ask_way(person_list)
22 print(res)
23 
24 # 流程
25 # 列表有5人。先问alex,            不满足return条件判断,弹alex,        没有返回值,用剩下的列表作为参数继续运行函数,并等待一个返回值
26 # 列表剩4人。再问wupeiqi,        不满足return条件判断,弹wupeiqi,        无法返回值,用剩下的列表作为参数继续运行函数,并等待一个返回值
27 # 列表剩3人。再问linhaifeng,    满足return条件判断,函数中断,返回值即问路结果,
28 # 返回值返回上一层,即wupeiqi层,        wupeiqi层获得返回值,    子函数结束,继续返回上一层
29 # 返回值返回上一层,即alex层,        alex 层获得返回值,        子函数结束,继续返回上一层
30 # 问路主函数得到最终返回值问路结果,函数结束。
31 
32 
33 import time
34 res=time.sleep(5)
35 print('----------->')












原文地址:https://www.cnblogs.com/shijieli/p/9687716.html