2015-09-18 127 views
10

好了,所以這段代碼是從我校實踐問題。我們要精神分析代碼並檢查答案。Python函數返回迴路

當我第一次解析它時,我得到了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-1)功能foo(x=5)這使得它檢查是否還有一次又一次,直到x == 0那麼它裏面返回1.如何返回1最終打印8?

+6

重複的http://stackoverflow.com/questions/32653496/python-function-return-loop? – wap26

+0

對於_x_的非負整數值,「foo」是「2到_x_ power」的遞歸計算。 (如果它將'foo(x-1)'乘以'x'而不是'2',它會計算出「_x_ factorial」)。 –

+1

@ wap26您提供的鏈接似乎是我的問題 – proxenmity

回答

18

你將下面的調用爲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 

是否清楚了嗎?

+0

@JamesHaskett:這個答案(隱式)顯示了一種不使用遞歸實現相同功能的方法。在遞歸和不遞歸的情況下實現'foo'都是一個很好的練習,並比較兩種方法。 –

11

我認爲你有正確的想法(否則你就不會得到答案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
4

遞歸與您最初期望的相反。它不以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。一旦你明白這一點,你就會理解遞歸。