递归函数

导引:

递归函数的定义:

先看例子

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))

 

posted @ 2019-02-14 23:35  舒畅123  阅读(207)  评论(0编辑  收藏  举报