[英]understanding recursive function python
我試圖了解調用此遞歸函數時會發生什么。 該代碼應該是跟蹤
def mysum(lower, upper, margin):
blanks = ' ' * margin
print blanks, lower, upper
if lower > upper:
print blanks, 0
return 0
else:
result = lower + mysum(lower + 1, upper, margin + 4)
print blanks, result, lower, margin
return result
if __name__ == "__main__":
mysum(1, 4, 0)
輸出顯示
1 4
2 4
3 4
4 4
5 4
0
4 4 12
7 3 8
9 2 4
10 1 0
我不明白為什么函數在返回0后就開始展開。您能幫我跟蹤發生的情況嗎
簡而言之,您總是在到達return
語句之前進行遞歸調用,直到達到基本情況為止。 然后,您總是會在到達另一個遞歸調用之前就到達return
語句(這很簡單,因為只有一個遞歸調用)。
當該函數的一次調用返回0(“自下而上”)時,堆棧上可能還有許多其他對該函數的調用,等待繼續。 當遞歸達到最低點時,控制權將返回到堆棧上的最后一個函數。 它完成工作並返回,然后控制返回到堆棧上的下一個較早的函數。 這將繼續進行,直到所有對mysum
的調用都從堆棧中刪除為止(與將它們放在堆棧中的順序相反)。
也許您已經了解了所有內容:)如果是這樣,請說明“為什么函數開始展開”的含義。
我認為這里有用的觀察是,在任何嵌套調用返回之前先打印前五行。 這一切都發生在函數主體的第一部分:
print
-檢查條件-轉到else
-並從頭再下一層。
打印0
,將返回最深的調用,因此將計算出第二個最深的result
。 然后從下一行開始print
-這是第一行,其中有3個數字。 然后,您點擊另一個return
,從而計算出另一個result
,依此類推。連續收益對應於較早的調用-因此它們的blanks
更少。
這是帶有注釋的代碼,可幫助您開始理解遞歸函數的工作方式。
def mysum(lower, upper, margin):
blanks = ' ' * margin # First time : margin = 0
# 2nd time : margin = 4
print blanks, lower, upper # first time : lower = 1, upper = 4
# 2nd time : lower = 2, upper = 4
if lower > upper: # first time : go to else (& 2nd time, ... until lower =5)
print blanks, 0
return 0
else:
result = lower + mysum(lower + 1, upper, margin + 4) # result is not directly calulated
# first it need to execute the call to
# the function, it will be the second call
print blanks, result, lower, margin
return result
if __name__ == "__main__":
mysum(1, 4, 0) # First call of your function
當lower為5時,不會調用mysum,它返回0。因此,您只需要展開一個步驟:lower為4時,您將位於“ else”部分。 你必須完成它
result = lower + mysum(lower + 1, upper, margin + 4)
print blanks, result, lower, margin
return result
與lower = 4,最后一次調用返回0。結果=4。然后展開另一步驟:lower在3處,而調用恰好在返回4之前,因此新結果為7。返回此值。
現在,lower = 3,對lower = 2,lower = 1,您也可以這樣做。
您會看到1 + 2 + 3 + 4 =10。這是函數的結果。 我希望我能幫助您,告訴我您是否不理解,也許我能找到另一種方式來解釋...:/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.