由于栈的大小不是无限的,所以递归调用的次数过多便会导致栈的溢出,通常解决栈溢出的方法
是尾递归优化,尾递归跟循环的效果一样,它在函数返回时调用函数本身,并在return语句不能包
含表达式。编译器和解释器就可以对尾递归进行优化,递归本身无论调用多少次都只占用一个栈帧
,从而避免栈的溢出。
代码实现:
#!usr/bin/python3
# -*- coding:UTF-8 -*-
def fact(m):
return fact_item(n, 1)
def fact_item(num, p):
if num == 1:
return p
return fact_item(num - 1, num * p)
print(fact(5))
代码的调用过程:
=====> fact_item(5, 1)
=====> fact_item(4, 5)
=====> fact_item(3, 20)
=====> fact_item(2, 60)
=====> fact_item(1, 120)
>>> 120
从结果就可以看到,调用尾递归的时候如果做出优化后,栈就不会增长,所以不管调用多少次都不会
导致栈溢出。