尾递归--避免栈溢出

Published: by Creative Commons Licence

我们知道, 在计算机中,函数是通过栈实现的, 每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。比如递归求阶乘的函数:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

当计算数值小的阶乘时候没有问题,但是如果数值过大,就会出现栈溢出.比如fact(2000),为了避免这种问题的出现,我们可以通过尾递归的方式来实现这个函数,如下:

def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

参考链接:廖雪峰的Python3教程