Python 递归函数

一、递归函数的定义

  通过之前的学习,大家都知道可以在函数内部,调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数

大家是否还记得小时候讲的小故事:老和尚给小和尚讲故事,讲的什么呢,从前有座山,山里有座庙,庙里有个老和尚在和小和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚在和小和尚讲故事……用函数给大家写出来就是这样的:

def story():
    print('从前有座山,山里有座庙,庙里有个老和尚在和小和尚讲故事')
    return story()
story()

这就是一个最简单的递归函数。

递归的最大深度——997/998

  老和尚给小和尚讲故事这个函数运行到最后会报错,但这个错误并不是因为函数有误,而是递归有最大的深度。每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存,于是python为了杜绝此类现象,强制的将递归层数控制在了997,算上最外层的一次调用的话,那最大深度也可以认为是998。可使用下例进行验证:

def story(n):
    print(n)
    n += 1
    story(n)
story(1)

997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:

我们将python允许的递归深度设置为了5w,至于实际可以达到的深度就取决于计算机的性能了,不过这个默认的递归深度一般是不建议更改的。

import sys
print(sys.setrecursionlimit(50000))
def story(n):
    print(n)
    n += 1
    story(n)
story(1)

递归的小例子:

例一:

阶乘的计算:

阶乘的概念:
1!=1 2!=1*2 3!=1*2*3 4!=1*2*3*4 5!=1*2*3*4*5 n!=1*2*3*4*5*...*(n-1)*n

用函数写的话就是fact(n)=fact(n-1)*n,只有1做特殊处理。

def fact(n):
    if n ==1:
        return 1
    else:
        return fact(n-1)*n

例二:

求孙悟空的年龄:

施主问孙悟空的年龄是多少,孙悟空说比猪八戒大50岁,猪八戒比沙僧大50岁,沙僧比唐僧大50岁,唐僧现在是30岁,求悟空的年龄是多少?

先定一个函数age().

age(4) = age(3) + 50
age(3) = age(2) + 50
age(2) = age(1) + 50
age(1) = 30

函数的具体写法:

def age(n):
    if n == 1:
        return 30
    else:
        return age(n-1)+50
print(age(4))

例三:

通过递归函数移动汉诺塔

def move(n, a, b, c):
    if n == 1:
        print('move', a, '-->', c)
        return
    move(n-1, a, c, b)
    print('move', a, '-->', c)
    move(n-1, b, a, c)
def move(n, a, b, c):
    if n == 1:
        print ('%s-->%s' %(a,c))
    else:
        move(n-1, a, c, b)
        move(1, a, b, c)
        move(n-1, b, a, c)

 

posted @ 2018-01-08 17:15  amyleell  阅读(103)  评论(0)    收藏  举报