簡體   English   中英

Python函數返回循環

[英]Python Function Return Loop

好的,所以這段代碼來自我學校的練習題。 我們要在心理上解析代碼並檢查答案。

當我第一次解析它時,我得到4.我復制了代碼並通過IDLE運行它得到8.我運行調試器並看到else:return循環if else語句直到x == 0然后它返回1 。

我不明白返回1是如何出現在8。

def foo(x=5):
    if x == 0:
        return 1
    else:
        return 2*foo(x-1)

print(foo(3))

我理解它在函數foo(x=5)中調用foo(x-1) ,這使得它一次又一次地檢查是否為x == 0然后返回1.返回1如何最終打印8?

您將對foo進行以下調用:

foo(3) -> foo(2) -> foo(1) -> foo(0)

那些會回來的

foo(0) -> 1
foo(1) -> 2 * foo(0) -> 2 * 1 -> 2
foo(2) -> 2 * foo(1) -> 2 * 2 -> 4
foo(3) -> 2 * foo(2) -> 2 * 4 -> 8

現在清楚了嗎?

我認為你有正確的想法(否則你不會得到答案4),你只是在心理鍛煉中過早墮胎。

您可以在瀏覽代碼時通過列表來跟蹤變量:

  • foo(3)
    • 調用foo(3 - 1)foo(2)
      • 調用foo(2 - 1)foo(1)
        • 調用foo(1 - 1)foo(0)
          • 返回1
        • 返回2 * foo(1 - 1)2
      • 返回2 * foo(2 - 1)4
    • 返回2 * foo(3 - 1)8

遞歸與您最初期望的相反。 它不是以x = 3開頭,而是跟隨所有遞歸調用,x的第一個值實際上是0。

下面是您腳本的修改版本,它說明了如何運行步驟以及它如何到達8的順序。

def foo(x=5):
    if x == 0:
        r = 1
        print (x, r)
        return r
    else:
        r = 2*foo(x-1)
        print (x, r)
        return r

print(foo(3))

注意打印的x的第一個值是1而不是你給它的3。 一旦你理解了這一點,你就會理解遞歸。

暫無
暫無

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

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