是否在运行递归函数时始终使用调用堆栈

时间:2014-01-14 09:05:47

标签: python

以下递归函数在调用堆栈上创建一个框架,然后一旦达到基本案例,所有结果都会弹出堆栈:

def subL(L):
    x=len(L)
    if x==1:
        return L
    else:
        subL(L[:x-1])
        print(L[:x-1]) #<<onto the call stack  

>>> j=[2,5,99,31,14,5]
>>> subL(j)

[2]
[2, 5]
[2, 5, 99]
[2, 5, 99, 31]
[2, 5, 99, 31, 14]  

我认为所有递归函数都使用了调用堆栈但是执行以下操作?如果我将递归调用放在脚本的末尾,那么不需要调用堆栈吗?

def subLx(L):
    x=len(L)
    if x==1:
        return L
    else:
        print(L[:x-1]) #runs each time it is called so call stack not required?
        subLx(L[:x-1])

>>> q=[2,5,99,31,14,5]
>>> subLx(q)

[2, 5, 99, 31, 14]
[2, 5, 99, 31]
[2, 5, 99]
[2, 5]
[2]

1 个答案:

答案 0 :(得分:2)

您正在询问尾部呼叫优化。 Python不进行此优化:所有函数调用都分配一个新堆栈。这就是为什么在Python中达到递归限制相对容易,即使是使用尾调用。