死循环,因此递归必须要定义一个明确的结束条件
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('----------->')