2014-02-12 38 views
4

我是一個試圖學習JavaScript作爲第一語言的系統管理員。我正在研究的其中一個文本在遞歸章節中有這個代碼示例。noob javascript遞歸

(變量改變爲簡單起見)

function fruit(n) { 
    return n > 1 ? fruit(n - 1) + "apples" : "bananas"; 
} 

我理解函數的三元運營商方面,同樣的事情可以寫成這樣:

function fruit(n) { 
    if n > 1 
     return fruit(n - 1) + "apples"; 
    else 
     return "bananas"; 
} 

當我打電話的功能,我得到下面的結果

console.log(fruit(3)); 

bananas apples apples 

我不明白第一個值是如何香蕉(瓦特那麼這不意味着條件3> 1將是錯誤的)?關於如何執行此代碼以獲得該結果,發生了什麼?

不知道這個網站是小菜友好,但提前感謝任何幫助。

+0

第一個條件調用水果。運行紙上的代碼。 –

回答

0

這是因爲遞歸執行如下:

function fruit(n) { 
if n > 1 
    return fruit(n - 1) + "apples"; 
else 
    return "bananas"; 
} 

在你給的例子(上面列出的),你檢查,看看是否n > 1。在這種情況下,n = 3所以答案是肯定的。那麼我們該怎麼辦?我們執行水果(2)。

是2大於1?是的,那麼我們該怎麼做?我們執行水果(1)。

是1> 1?不,所以我們寫香蕉。

然後遞歸排序的回溯曲線,寫回蘋果和蘋果,以完成前面的方法。

VISUAL例: 因爲我們知道該函數將返回「香蕉」只有當n <= 1

function fruit(3)將返回的東西,然後寫上「蘋果」

fruit(3) = fruit(2) apples 
    fruit(2) = fruit(1) apples 
    fruit(1) = banana 

所以你看,所以代[fruit(2)](fruit(1))

fruit(3) = [fruit(1) apples] apples 
fruit(3) = [(banana) apples] apples 
4

當無花果爲了實現遞歸,最好從基本案例開始。在這種情況下,您的基本情況是fruit(1) - 我希望很明顯,這將返回bananas

現在考慮fruit(2) - 這將返回fruit(1) + "apples",我們已經知道fruit(1)bananas,所以這意味着bananas apples

進一步擴展這種情況下 - fruit(3)基本上是fruit(2) + "apples",並且你已經知道什麼是fruit(2) ......你最終"bananas apples" + "apples",給你你的結果。

+0

這是一個很好的解釋方法。 –

1

我已經測試你的代碼就像如下:

<script> 
function fruit(n) { 
    console.log("Called with " + n); 
    if (n > 1) { 
     return fruit(n - 1) + "apples "; 
    } else { 
     console.log("Called with " + n + " returning bananas."); 
     return "bananas "; 
    } 
} 
console.log(fruit(3)); 
</script> 

我的輸出:

Called with 3 
Called with 2 
Called with 1 
Called with 1 returning bananas. 
bananas apples apples 

線返回果(N - 1)+ 「蘋果」;意味着你連接一個字符串:「香蕉」+「蘋果」+「蘋果」。

尋找每一步:

fruit(3): 
- calling fruit(2) 
- - calling fruit(1) 
- - get return "bananas" // string consinst of "bananas" only here 
- get return "apple" // string = "bananas" + "apple" 
get return "apple" // string = "bananas" + "apple" + "apple" 

編輯: 如果你想在結尾處香蕉。 再次更改

return fruit(n - 1) + "apples "; 

return "apples " + fruit(n - 1);