在尾部递归中重用先前分配的空间

时间:2019-04-18 01:10:02

标签: python recursion

我正在从tail recursion - LeetCode读尾递归

它指出python不支持尾递归优化

  

尾部递归函数可以作为非尾递归函数执行,即带有大量调用堆栈的,而不会影响结果。通常,编译器会识别尾部递归模式,并优化其执行。但是,并非所有的编程语言都支持此优化。例如,C,C ++支持尾递归函数的优化。另一方面,Java和Python不支持尾递归优化。

我不知道tail recursion optimization是什么意思。

本教程提供了一个示例

def sum_non_tail_recursion(ls):
    """
    :type ls: List[int]
    :rtype: int, the sum of the input list.
    """
    if len(ls) == 0:
        return 0

    # not a tail recursion because it does some computation after the recursive call returned.
    return ls[0] + sum_non_tail_recursion(ls[1:])

def sum_tail_recursion(ls):
    """
    :type ls: List[int]
    :rtype: int, the sum of the input list.
    """
    def helper(ls, acc):
        if len(ls) == 0:
            return acc
        # this is a tail recursion because the final instruction is a recursive call.
        return helper(ls[1:], ls[0] + acc)

    return helper(ls, 0)

并说明

img

  

请注意,在尾部递归中,我们知道从递归调用返回后,我们也将立即返回,因此我们可以跳过返回的整个递归调用链,直接返回到原始调用者。这意味着我们完全不需要所有递归调用的调用堆栈,从而节省了空间。

     

例如,在步骤(1)中,将在堆栈中为f(x1)分配一个空间,以便调用f(x2)。然后在步骤(2)中,函数f(x2)将递归调用f(x3)。但是,除了在栈上分配新的空间外,系统还可以简单地重用先前为第二个递归调用分配的空间。最后,在函数f(x3)中,我们达到了基本情况,该函数可以简单地将结果返回给原始调用者,而无需返回到先前的函数调用。

这里的关键思想是我们可以跳过整个递归调用链,并重用之前分配的空间。

至于python,它不支持尾递归优化。

这是否意味着python仍然需要调用堆栈,并且不会在尾部递归中重用之前分配的空间?

0 个答案:

没有答案