簡體   English   中英

是否在運行遞歸函數時始終使用調用堆棧

[英]Is call stack always used when running recursive functions

下面的遞歸函數在調用堆棧上創建一個框架,然后一旦到達基本案例,所有結果都會彈出堆棧:

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]

你問的是Tail Call Optimization。 Python不進行此優化:所有函數調用都分配一個新堆棧。 這就是為什么在Python中達到遞歸限制相對容易,即使使用尾調用也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM