参考:廖雪峰python教程
递归函数:函数内部调用自身来完成计算。
比如我们要计算阶乘n! = 1 x 2 x 3 x ... x n
,用函数function1来表示,可采用如下写法。
def function1(n):
if n==1:
return 1
return n*function1(n-1)
递归函数优点是定义简单,逻辑清晰。但是由于在计算机中通过系统栈来实现,所以当调用递归函数次数过多时,就会产生溢出。
为了解决溢出现象,可以使用尾递归来实现对递归函数的优化。尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式,黑体字是防止溢出的关键。这样就可以使递归函数无论被调用多少次都只有一个栈帧被使用。
改进:
def function2(num, product):
if num == 1:
return product
return function2(num-1, num*product)
尾递归调用时,栈不会增长。
===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120
遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。
递归实现汉诺塔:
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n-1, a, c, b)
print(a, '-->', c)
move(n-1, b, a, c)