我正在从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)
并说明
请注意,在尾部递归中,我们知道从递归调用返回后,我们也将立即返回,因此我们可以跳过返回的整个递归调用链,直接返回到原始调用者。这意味着我们完全不需要所有递归调用的调用堆栈,从而节省了空间。
例如,在步骤(1)中,将在堆栈中为
f(x1)
分配一个空间,以便调用f(x2)
。然后在步骤(2)中,函数f(x2)
将递归调用f(x3)
。但是,除了在栈上分配新的空间外,系统还可以简单地重用先前为第二个递归调用分配的空间。最后,在函数f(x3)
中,我们达到了基本情况,该函数可以简单地将结果返回给原始调用者,而无需返回到先前的函数调用。
这里的关键思想是我们可以跳过整个递归调用链,并重用之前分配的空间。
至于python,它不支持尾递归优化。
这是否意味着python仍然需要调用堆栈,并且不会在尾部递归中重用之前分配的空间?