递归函数
计算:n!
deffact(n):
ifn==1:
return1
returnn*fact(n-1)
print(fact(6))
但n=6时,输出:
720
可见递归函数的定义非常简单,但使用时很容易发生栈溢出。
deffact(n):
ifn==1:
return1
returnn*fact(n-1)
print(fact(1000))
输出就会报错:
File "C:/Users/苏小爪/20171208.py", line 68, in fact
return n*fact(n-1)
File "C:/Users/苏小爪/20171208.py", line 66, in fact
if n==1:
RecursionError: maximum recursion depth exceeded in comparison
我们通过使用尾递归来解决这个问题:
'''采用尾递归优化'''
deffact(n):
returnfact_tail(n,1)
deffact_tail(num,product):
ifnum ==1:
returnproduct
returnfact_tail(num -1,num * product)
print(fact(6))
输出:720
递归函数用尾递归来解决栈溢出的问题,思路是函数调用函数,并从尾部开始。
练习:
汉诺塔的移动。用递归函数来实现。
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
解题:
设:柱子为a,b,c,圆盘数为n。(n,n-1,n-2......3,2,1),小数在上,大数在下。
'''汉诺塔'''
defmove(a,b,c,n):
ifn==1:
print(a,'-->',c)
else:
move(a,c,b,n-1)
print(a,'-->',c)
move(b,a,c,n-1)
print(move('a','b','c',3))
测试输出:
None
领取专属 10元无门槛券
私享最新 技术干货