跳转至

递归 Recursion

递归栈溢出 Recursion Stack Overflow

递归需要栈空间,有时候会栈溢出。

尾递归 Tail Recursion

有些情况下可以用尾递归避免栈溢出。一个function(或subroutine)的最后一步(不一定是最后一行代码)也是一个function的话,就是tail call,如果这个function是自身,就是尾递归。

比如:

def factorial(n):
    def factorial_tail(n, accumulator):
        if n < 0:
            raise ValueError
        if n == 0:
            return accumulator
        return factorial_tail(n - 1, accumulator * n)
    return factorial_tail(n, 1)

某些语言能自动优化尾递归,因为每层递归都相当于把factorial_tail(n, acc)变成了factorial_tail(n - 1, acc * n),就像数学化简一样。

不过Python是不支持尾递归优化的。Python最多支持1000层递归,你试试factorial(1000)

当然能用尾递归优化的,基本都能写成循环。

现状是,大部分常用语言都不支持的,Java、JavaScript(V8)、Python都不支持。Scala、Haskell都是自动优化的,Kotlin要加个tailrec修饰符。