尾递归

把计算出的值存在函数内部(当然不止尾递归)是其计算方法,从而不用在栈中去创建一个新的,这样就大大节省了空间。函数调用中最后返回的结果是单纯的递归函数调用(或返回结果)就是尾递归。


  • 阶乘
    常规递归阶乘:
def factorial(n):  
    if n == 0:
        return 1
    return factorial(n - 1) * n

过程如下:

factorial(4)  
factorial(3) * 4  
factorial(2) * 3 * 4  
factorial(1) * 2 * 3 * 4  
factorial(0) * 1 * 2 * 3 * 4  
1 * 1 * 2 * 3 * 4  
1 * 2 * 3 * 4  
2 * 3 * 4  
6 * 4  
24
def factorial(n, acc=1):  
    if n == 0:
        return acc
    return factorial(n - 1, n * acc)

我们再看下执行过程:

factorial(4, 1)  
factorial(3, 4)  
factorial(2, 12)  
factorial(1, 24)  
factorial(0, 24)  
24 

factorial 函数在递归调用时减少之前增多的中间变量,将状态保存在 acc 变量中。这就叫做尾递归。


  • 斐波那契数列
    常规递斐波那契数列:
def fib(n):
    if n < 2:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

尾递归:

def fib_tail(n, r, t):
    if n == 1:
        return r
    else:
        return fib_tail(n - 1, t, r + t)

总结:每次递归调用都会导致增大进程内存占用量。如果递归层数很深,会导致堆栈溢出错误。
本文参考尾递归

你可能感兴趣的:(尾递归)