2016-01-20 133 views
0

有人可以向我解釋爲什麼從下面的遞歸函數的最終返回值是正確的?JavaScript函數'返回'值?

function(factorial) { 
    if (n == 0) 
    return 1; 
return n * factorial (n -1); 
} 

我瞭解遞歸,但我不明白爲什麼返回值,而不是僅僅1的正確結果,..如果我改變返回2,那麼它只是雙打階乘的結果。所以看起來,無論我在這個迴歸表達式中的任何價值成爲階乘函數累積結果的乘數,爲什麼這樣呢?階乘函數的積累結果如何存儲?所有回覆讚賞

+5

從您的評論看來,你真的不明白遞歸。認真思考。如果你輸入'3',會發生什麼? (提示:它會返回3 * 2 * 1,因爲它是返回3 *因子(2),它是'返回3 *(2 *因子(1))' – slebetman

回答

-1

繪製一個堆棧(先進後出)結構,並看到你的函數執行與返回值每次。在執行完每一步之後,從其中彈出塊。現在您可以看到之前調用的塊返回到當前調用的塊的值。

注意:這裏的塊不過是你的遞歸函數。

3

這樣

function factorial (n) { //line 1 
    if (n == 0) //line 2 
    return 1;//line 3 
return n * factorial (n -1);//line 4 
} 

n = 3只是dry-run的方法,並factorial(3)被調用時,它會經過4遞歸(函數調用factorial(n)

遞歸1 N = 3 ,第2行條件失敗,因此它進入第4行並返回3 * factorial(2)

遞歸2 n = 2時,第2行條件失敗,因此轉到第4行,並返回2 * factorial(1)

遞歸3 n = 1時,第2行條件失敗,因此轉到第4行,並返回1 * factorial(0)

遞歸4 n = 0,第2行條件現在成功,所以它轉到第3行並返回1。現在它將返回遞歸3中的函數調用,它將用1 * 1代替1 * factorial(0),並在返回到第一次遞歸調用並返回單個值時最終返回3 * 2 * 1 * 1

這意味着如果您在第2行返回2,則所有事情都會與2相乘。

簡單是吧:)

2

試想輸入作爲5.Then第一個函數調用的最終結果會是怎樣,

市價修改@ gurvinder372的評論:

return 5*(return 4 * (return 3 * (return 2 * (return 1 * (return 1))))) 
+0

不應該是'return 5 *(返回4 *(返回3 *(返回2 *(返回1 *(返回1)))))''因爲OP正在檢查'n = 0'? – gurvinder372

+0

是的。謝謝您指出。 :) – Raghu

2

你可以簡單地展開一個factorial(5)

  • factorial(5)
  • factorial(5) = 5 * factorial(4)
  • factorial(5) = 5 * 4 * factorial(3)
  • factorial(5) = 5 * 4 * 3 * factorial(2)
  • factorial(5) = 5 * 4 * 3 * 2 * factorial(1)
  • factorial(5) = 5 * 4 * 3 * 2 * 1 * factorial(0)
  • factorial(5) = 5 * 4 * 3 * 2 * 1 * 1
+0

感謝Frogatto - 你展現的因子和上面的答案真的有幫助! – Ozventurer

0

謝謝你們所有的答案 - Frogattos的回答可能是真正提高我理解的答案;

factorial(5) 
factorial(5) = 5 * factorial(4) 
factorial(5) = 5 * 4 * factorial(3) 
factorial(5) = 5 * 4 * 3 * factorial(2) 
factorial(5) = 5 * 4 * 3 * 2 * factorial(1) 
factorial(5) = 5 * 4 * 3 * 2 * 1 * factorial(0) 
factorial(5) = 5 * 4 * 3 * 2 * 1 * 1 

乾杯!