當涉及到遞回函式時,我很難理解 python 解釋器的行為。
以下代碼失敗并產生意外結果 (0,1,2,3,4,5,5,4,5,5,3,4,5....):
def recur(num):
while num < 6:
print(num)
num =1
recur(num)
recur(0)
使函式回傳解決了問題(1,2,3,4,5)
def recur(num):
while num < 6:
print(num)
num =1
return recur(num)
recur(0)
在初始化新呼叫時,如果沒有回傳原始函式不會終止是有道理的,但是我無法解釋導致結果的流程。
謝謝!
uj5u.com熱心網友回復:
在while回圈內添加 return只是確保回圈只回圈一次迭代。對于遞回,您實際上并不需要回圈(遞回就是回圈),這只會使事情變得混亂。您需要一個停止遞回和遞回呼叫的條件:
def recur(num):
if num < 6: # base condition
print(num)
recur(num 1) # recursive call
recur(0)
印刷:
0
1
2
3
4
5
顯然,如果你想從 開始列印1,你可以呼叫recur(1).
uj5u.com熱心網友回復:
要解釋您的原始輸出(0,1,2,3,4,5,5,4,5,5,3,4,5....):
前 6 個條目(0,1,2,3,4,5)由初始遞回創建。您列印一個值,然后使用下一個更高的值進行遞回。在 6 處,您的遞回結束而不列印值(未輸入 while 回圈)。
此時,您回傳到列印 5 并且現在持有值 6 的函式(因為它在遞回之前遞增)。該函式停止其 while 回圈,回傳。然后你轉到最初有數字 4 的函式。它的值增加到 5。因此它回圈,列印 5,增加到 6,然后遞回。什么都不做,回傳。
原來得到 4 的函式現在是 6,回傳到原來得到 3 現在持有 4 的函式。所以現在遞回繼續 4 和 5,然后一直回傳到最初接收 2 的函式,現在持有 3,以此類推。
換句話說,如果您只向下計數遞回,則會在以下組中生成值:
(0,1,2,3,4,5), (5,), (4,5), (3,4,5), ...)
(注意:我對我的術語很草率。當我說回傳函式時,我的意思是回傳到遞回函式的堆疊幀。我希望我沒有進一步混淆你)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/348026.html
