簡體   English   中英

了解遞歸函數python

[英]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.

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