2016-11-11 18 views
-2

請解釋。 Line return num * factorialize(num - 1)。假設我們有一個整數5作爲參數。必須是5 * factorialize(5-1)= 5 * 4 = 20。我們如何達到120?取這個factorialize函數並且通過它

function factorialize(num) { 
    if (num === 0) { 
     return 1; 
} 

    return num * factorialize(num - 1); 
} 

factorialize(5) 
+0

步行到'factorialize(4)'...這將由於num不爲零,因此不會立即返回。那它有什麼作用? –

+0

'factorialize(x)'將總是返回* x *的階乘。所以,'5 * factorialize(5-1)= 5 * 4! = 5 * 24 = 120' – halfo

+0

對不起。非常感謝您的幫助,但我不明白。我們沒有循環。所有這個函數的作用是,如果number等於0,則返回1.如何num * factorialize(num-1)給我們5 * factorialize(5-1)= 5 * 4! = 5 * 24? –

回答

0

從你的問題

引用假設我們有作爲參數的整數5。必須是5 * factorialize(5-1)= 5 * 4 = 20。我們如何達到120?

當您開始使用5 * factorialize(5 - 1)時,您將5-1評估爲4(正確),但是後來您放棄了對該因子的調用。這就是你如何得到20.

讓我們拿這factorialize功能,並通過它。

function factorialize(num) { 
    if (num === 0) { 
     return 1; 
    } 

    return num * factorialize(num - 1); 
} 

factorialize(5) 

由於5通入factorialize,局部變量是num不等於0則該函數返回num * factorialize(num - 1)。由於num是5,我們將繼續並開始插入數字。

= 5 * factorialize(5 - 1) 

現在在這裏,我們再次呼籲factorialize,這次傳遞4(5 - 1)。這仍然是不等於0,所以我們用它的返回值替換factorialize(5 - 1)(因爲num是4在此調用factorialize,我們將返回4 * factorialize(4 - 1)

= 5 * (4 * factorialize(4 - 1)) 

如同之前,我們現在叫factorialize再次,這一次傳遞3

= 5 * (4 * (3 * factorialize(3 - 1))) 

等等

= 5 * (4 * (3 * (2 * factorialize(2 - 1)))) 

如此反覆

= 5 * (4 * (3 * (2 * (1 * factorialize(1 - 1))))) 

現在factorialize(0)返回1; if語句最終評估爲true。這是基本案例,這是一個已知的答案,可以表達而不用進一步使用遞歸。代,我們得到這樣的:

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

這是數學上等價於

= 5 * 4 * 3 * 2 * 1 * 1 

它通過呼叫等於

= 120 
+0

謝謝克里斯。感謝您的漫步,並感謝您的好。我不理解人們爲了我的好奇而投票,我試圖學習並真正理解它背後的邏輯。非常感謝你。 –

+0

不客氣,@EdgarKiljak。遞歸是計算機科學中難以理解的概念之一,所以有時候,一步步一步一步真正幫助! –

+1

@torazaburo,我用以下兩個假設解決了這個問題:提問者沒有寫出原始代碼,這是一個基本的一般遞歸問題,而不是一個特定於JavaScript的問題。另外,正如我在我的回答開頭解釋的那樣,實際的邏輯謬誤是將'factorialize(5-1)'評估爲'4'而不是'factorialize(4)'。 –

相關問題