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)

浙公网安备 33010602011771号