2013-07-18 37 views
0

指向我有疑問的部分的鏈接。 Think Python - chapter 6, section 5think python - section 6.5

此代碼讓我失去了。運行時,它發現n!,但我不知道如何。我認爲我誤解的部分是「recurse = factorial(n-1)」這一行。

def factorial(n): 
    if n == 0: 
     return 1 
    else: 
     recurse = factorial(n-1) 
     result = n * recurse 
     return result 
  1. 不調用該函數並將其發送回頂部? (顯然不是,但我不確定爲什麼不)。

  2. 此外,函數完成將因素(3!分解爲3,2,1,1)後,將它們相乘。它在哪裏記住它們?

我確定這很簡單,但它讓我難住。

+1

http://stackoverflow.com/questions/717725/understanding-recursion和順便說一句,你的問題不是「思考python - 第6.5節」,但理解遞歸。 – tamasgal

回答

6

這是發生了什麼,當你運行factorial(3)

factorial(3) 
    recurse = factorial(2) 
    recurse = factorial(1) 
     recurse = factorial(0) 
     return 1 
     return 1 * 1 = 1 
    return 2 * 1 = 2 
    return 3 * 2 = 6 

所以在遞歸的每一步你有內梯和n當前值的返回值。

+0

不妨指出這些數字也暫時存儲在堆棧幀中。 – sean

+0

爲了確保我明白了,堆棧幀中存儲的是每個遞歸還沒有完成(在它能夠中斷,返回或以其他方式結束之前被回送)的事實。直到代碼最後碰到if語句的第一部分(並返回1),程序終於可以自由地讓其他「懸掛」函數返回,並完成每個函數調用的最後兩行。那是對的嗎? –

+0

感謝您的幫助sean,TheifMaster和septi。 。 。我錯過的是如何遞歸嵌套。這從未明確表示。 ThiefMaster的縮進是一個線索。出於某種原因,我一直在想,一旦函數被遞歸調用,函數調用中留下的所有內容都被「忘記了」。不知道爲什麼我這麼想。無論如何,我現在明白了。謝謝! –