以下递归函数在调用堆栈上创建一个框架,然后一旦达到基本案例,所有结果都会弹出堆栈:
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]
答案 0 :(得分:2)
您正在询问尾部呼叫优化。 Python不进行此优化:所有函数调用都分配一个新堆栈。这就是为什么在Python中达到递归限制相对容易,即使是使用尾调用。