递归函数
导引:
递归函数的定义:
先看例子
def story(): print('从前有座庙') story()#这里是与以前函数最大的不同,多了这一行代码 story()
上面的函数就是一个典型的递归函数,递归函数就是在函数内部调用自己的函数。
但是上面这段代码在运行过程中会报错,RecursionError: maximum recursion depth exceeded while calling a Python object
注意这不是程序的问题,而是超过了最大递归深度。最大递归深度是python程序从内存角度做的限制,对内存的一种保护措施,
那么这个最大递归深度是多少?
n=0 def story(): global n#注意一定需要将这个n定义为全局变量 print('从前有座庙') n=n+1 print(n) story()#这里是与以前函数最大的不同,多了这一行代码 story()
运行结果显示,n的最大值是997,也就是说递归的最大深度是997次
但是这个最大递归深度可以修改
import sys sys.setrecursionlimit(10000000)#利用这个可以修改最大递归深度 n=0 def story(): global n#注意一定需要将这个n定义为全局变量 n=n+1 print(n) story()#这里是与以前函数最大的不同,多了这一行代码 story()
上面这段代码在自己的电脑上运行结果是3924,老师的苹果笔记本电脑是26000多次,这个数值跟电脑的配置有很大关系。
注意,程序默认的最大递归深度997次,是对电脑内存的一种保护措施,一般不要随意调整。
如果递归次数太多,比如超过最大递归深度997次,那么说明这个问题根本就不适合使用递归。
递归函数的优缺点:
缺点:占内存
优点:代码简单
递归函数
def age(n): if n==4: return 40 elif n>0 and n<4: return age(n+1)+2 print(age(1))
递归常见的问题:
1、超过最大递归限制的报错
解决办法:只要是写递归函数,必须要有结束条件
2、返回值
不要只看到return就认为已经返回了,要看到返回操作是递归到第几层发生的,然后返回给谁
如果不是返回给最外层函数,调用者就接收不到
需要再分析,看如何把结果返回回来
其实使用递归能够实现的功能,使用循环也能够实现,但是使用循环需要考虑非常多的因素,递归更为简单。
作业:
斐波那契及数列:
自己参照老师昨天写的求年龄的代码,写了一个代码,但是结果出现错误
1 def func(n): 2 if n==2: 3 return 1 4 elif n>1 and n<10: 5 return func(n)+func(n+1) 6 print(func(3))
老师写的代码
1 def func(n): 2 if n==1 or n==2:#这里必须有一个限制条件作为边界,否则就容易报错 3 return 1 4 return func(n-1)+func(n-2) 5 print(func(6))
代码运行过程分析:以func(4)为例
1 def func(4): 2 if n==1 or n==2: 3 return 1 4 return func(3)+func(2)#从第9行代码可知func(3)=2,进而计算出func(3)+func(2) 5 6 def func(3): 7 if n==1 or n==2: 8 return 1 9 return func(2)+func(1)#将func(2)=1和将func(1)=1传给这里,func(2)+func(1)的返回值是func(3)传给第4行代码 10 11 print(func(4))#将第四行代码的结果返回到这里得出func(4)
上面的代码的运行过程类似于下面的树状结构,所以运行过程中非常占内存,非常慢,当func(50)计算机就会直接卡死
那么如何利用单递归实现:
下面是老师写的代码,自己完全没看懂,且代码在运行过程中报错
1 def func(n,l=[0]): 2 l[0] +=1 3 if n==1 or n==2: 4 l[0] -= 1 5 return 1,1 6 else: 7 a,b=(n-1) 8 l[0] -= 1 9 if l[0]==0: 10 return a+b 11 return b,a+b 12 print(func(6))
阶乘:
这是自己写按照斐波那契数列写的代码,结果还是报错,自己没有找到原因
1 def fac(n): 2 if n==1: 3 return 1 4 return fac(n)*fac(n-1) 5 print(fac(3))
这是老师写的代码,只不过是把fac(n)换成了n,自己依然不知道自己哪里错了
1 def fac(n): 2 if n==1: 3 return 1 4 return n*fac(n-1) 5 print(fac(3))