可以看到, 一般递归, 每一级递归都需要调用函数, 会创建新的栈,
随着递归深度的增加, 创建的栈越来越多, 造成爆栈:boom:
尾递归
尾递归基于函数的尾调用 , 每一级调用直接返回函数的返回值更新调用栈,而不用创建新的调用栈, 类似迭代的实现, 时间和空间上均优化了一般递归!
def tail_recursion(n, total=0): if n == 0: return total else: return tail_recursion(n-1, total+n)
执行:
tail_recursion(5)tail_recursion(4, 5)tail_recursion(3, 9)tail_recursion(2, 12)tail_recursion(1, 14)tail_recursion(0, 15)15
可以看到, 每一级递归的函数调用变成"线性"的形式.