2015-07-19 482 views
0

我遇到了freecodecamp的一個練習,它需要編寫一個代碼來返回給定整數的階乘,並給出了這個例子: 例如:5! = 1 * 2 * 3 * 4 * 5 = 120f。階乘...我不知道爲什麼這段代碼工作

我得到怎樣的數學作品,但我真的不能換我圍​​繞如何編寫它的頭,直到我發現這裏的東西,正計算器,但沒有爲什麼它的explination,活象是:

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

factorialize(5); 

我真的不明白這是如何迭代所有小於或等於num的整數。有人可以幫我解釋一下嗎?

回答

2

這是一個遞歸函數。

調用factorialize 5執行以下操作:

爲5等於0?不,這樣的話:

return num * factorialize(num - 1); 

代5 num表示它真的返回:

5 * factorialize(5-1) 

因此,我們可以簡化到

5 * (factorialize(4)) 

然後必須調用factorialize第二一半的聲明給計算機返回值。

所以你可以想象,factorialize與NUM再次調用= 4。由於num是不是等於零,它也返回相同的num * factorialize(num-1)。原來的語句現在是:

5 * (4 * factorialize(3)) 

,所以它必須再次調用本身......又一次......直到我們有

5 * 4 * 3 * 2 * 1 * factorialize(0) 

,然後實際上返回一個數字 - 這就是所謂的基本情況下,所以它不會無限遞歸本身。它返回1。

5 * 4 * 3 * 2 * 1 * 1 

所得我認爲基本情況應該是,如果(NUM == 1)。無論哪種方式它工作

編輯根據評論:0是有道理的,它顯然現在覆蓋0階乘。謝謝!對於num == 1的基本情況,它只會對參數num> 0進行因式分解。

+0

因爲0,所以'num == 0'! (零階乘)等於1。 – MrMadsen

0

它使用了一種叫做遞歸的東西。簡而言之,遞歸是函數自我調用時發生的事情。所以在這個例子中,num在每次傳遞給factorialize時遞減,並且num乘以傳遞給factorialize的數字。嘗試在else塊添加打印語句來看看這個數字被減少每次調用

相關問題