2012-06-20 43 views
1

我看不到我在這個遞歸調用的思念......(非常簡單的遞歸)我錯過了什麼?

var power = function(b, e) 
{ 
    if (e===0) 
    { 
     return 1; 
    } 
    else 
    { 
     return b*power(b, e-1); 
    } 
}; 

第一if語句是用於捕獲數字的零次方(那些總是等於1)。但它也是基本情況,所以當e(指數)達到0時,函數退出並給我留下正確的答案。

這是如何返回正確的數字而不是數字1?每次e降到0,但它返回正確的答案,而不是1.對不起,我是一個noob,但我很困惑...

+0

你見過'b * ...'? – Bergi

+0

好問題,我一開始也無法看到答案! –

+0

啊,我有這個相同的問題,奇怪。好問題! –

回答

4

你有一個遞歸函數,當它「返回1」,然後通過堆棧幀返回,並將堆積的所有其他b變量乘以1。 1 * b * b * b ...等

1 *什麼是身份函數。它返回本身,而不是1.

1

在堆棧上,您將有1 * b * b * b * b ... e次。當基本情況命中時,堆棧展開並且您得到正確的答案。

2

比方說你做power(2,4),它會進入else並返回2 * power(2, 3)。在它可以返回之前,它必須評估它返回的表達式,所以它的確如此。

這又進入elsereturn 2 * power(2,2)。同樣的交易在這裏,它必須評估表達。你繼續這樣做,直到你到達你的基本情況,它簡單地返回1.現在你到第二個從底部的水平,可以返回,因爲它將只是2*1,所以它會進入下一個更高的水平,這將等到2*2*1等,直到它達到最高級別,並給你你的答案。

請參閱this SO(同一問題)以獲取更多解釋。

+0

太棒了!謝謝您的幫助!對不起,這是一個重複的問題,我是全新的堆棧溢出....我試圖在未來更好地搜索。 – erparker

1

下面是一個執行例如:

功率=函數(2,2)

2是0時,則返回2 *函數(2,1)

-> 1 is different of 0, then return 2*function(2, 0) 

      -> 0 equal 0 return 1 

    -> return 2*1 

返回2 * 2 * 1

功率= 4