1,复习递归:返回值,不要只看到return就认为已经返回了,要看返回操作是在递归的第几层发生的,然后返回给了谁,如果不是返回给最外层函数,调用者就接收不到,需要再分析,看如何把结果返回回来,超过最大递归限制的报错,只要写递归,必须要有结束条件
2,几乎所有的递归问题都可以用循环来解决问题,只不过有时候,循环考虑的事情更多更复杂,递归会相对少一些,循环写好了,效率有时候会比递归好一点,有时候需要想太多问题,所以就用递归,比如快排,递归和算法联系很紧密,会把问题变简单,效率高。平时递归用的不多,除非,算法分析什么的,如果未来不做这些,工作的很长一段时间都是用不到的。面试有时候会考,递归是非常经典的计算机算法和思想,能看懂,能掌握几个经典的数学算法和概念就可以了
3,作业题一,斐波那契数列递归实现,一定要注意结束条件和传递
# 1,1,2,3,5,8,13,21,34,55 # 第一种,树性结构 def fib(n): if n == 1 or n ==2: return 1 # 结束条件 else: return fib(n-1) +fib(n-2) print(fib(10)) # 循环实现 def fib(n): num1, num2 = 1,1 num = 0 if n==1 or n==2: return 1 else: for i in range(n-2): num = num1 + num2 num1 = num2 num2 = num return num print(fib(8)) # 第三种 # 一次调用,那就返回两个值 def fib(n,l=[0]): # 默认参数的陷阱问题,无论发生多少次调用,这个地方都只是用这一个值,利用了这个陷阱问题,在不同的函数调用之间传递值 l[0] +=1 print(l[0]) if n == 1: return 1 if n ==2 : l[0]-=1 return 1,1 else: a,b = fib(n-1) l[0]-=1 print(l[0]) # 这只是个计数器,计算调用了多少次,最后减完了就可以返回结果了 # a,b = b,a+b if l[0] == 0: return a+b return b,a+b print(fib(11))
4,发生一次调用和两次调用的会非常慢,因为是树形调用,2的n次方和n次的区别
5,作业题二,阶乘
# 作业题二:阶乘factorial 1 1*2 # 循环实现 def fac(n): if n == 1: return 1 else: b = 1 for i in range(1,n+1): b = i * b return b print(fac(4)) # 递归实现 def fac(n): if n == 1: return 1 else: return n*fac(n-1) print(fac(3))
6,