2012-10-13 41 views
0

我很難理解else塊。我知道它應該將基本參數提升爲指數參數。但它是如何工作的?這段代碼的else塊的邏輯是什麼?

var power = function(base, exponent){ 

    if (exponent === 0){ 
     return 1; 
    } 
    else{ 
     return base * power(base, exponent - 1); 
    } 

}; 

power(2, 2); 
+2

這是一個遞歸函數,調用自己與不同的參數。 –

+2

這是遞歸的求冪運算。 * a^b = a * a ^(b-1)= a * a * a ^(b-2)= ... *我們知道* a^0 = 1 *。 – oldrinb

+0

'Math.pow(2,2)' –

回答

1
power(base, exponent - 1) 

真的只是base * power(base, exponent - 1)。但是,如果我們一直在想什麼是那些函數調用發生的事情,我們可以看到這一點:

base * ... pow(base, exponent - n) 

讓我們嘗試power(2, 4)

2 * (2 * (2 * (2 * (1)))) 

2 * power(2, 4 - 1); 

power(2, 4 - 1)簡化爲

2 * power(2, 3 - 1) 

其簡化爲

2 * power(2, 2 - 1) 

這簡化到

2 * power(2, 1 - 1) 

和簡化爲1因爲exponent0。當我們把它放在一起,這是我們得到:

2 * 2 * 2 * 2 * 1 
+0

我不明白每次循環時力量(2,4-1)是如何達到2:/感謝您的幫助。 – RufioLJ

+0

@RufioLJ因爲'pow(...)'表示2 * pow(...)'這意味着'2 * pow(...)'表示'1'。因此,在呼叫之前的每個2由內部呼叫的返回值進行多項疊加。返回值將是2或1(當exp === 01時最後1) – 0x499602D2

+0

@RufioLJ我知道這很讓人困惑,但是你究竟得到了什麼? – 0x499602D2

1

用於將輸入power(2/*base*/,2/*exponent*/)

ITERATION 1:由於2/*exponent*/不等於0:該條目時,它執行else一部分。

因此它應該返回2 * power(2,(2-1)/*which is 1*/)

迭代2:再次,有2/*base*/ and 1/*exponent*/ power(2,1)else部分被執行以power()函數的調用以參數:returns 2 * power(2,0)

ITERATION 3:再次有是power()函數的參數2/*base*/ and 0/*exponent*/

由於指數爲0,它會執行if部分並返回1,其中 完成第二次迭代,返回2。完成第一次迭代返回4的 。