2014-11-20 64 views
-1

我發現這個解決方案:遞歸最大公約數解釋

function gcd_rec(a, b) { 
    if (b) { 
     return gcd_rec(b, a % b); 
    } else { 
     return Math.abs(a); 
    } 
} 

我試圖環繞它是如何工作的我的頭,我卡在第二行if (b) {

顯然它應該如果存在b,請通過函數(本身)運行?是真的?但是這一次運行時,它在那裏a現在的bb價值是現在的ab所得的餘數。

這是否意味着它永遠不會返回Math.abs(a)只要用戶將一個值b ???

有人可以解釋這樣對我?

+0

'如果(B)'不會在此代碼成功時'B'是'0'。也就是說,當'b'爲零時代碼退出,結果在'a'中找到。 – Pointy 2014-11-20 19:23:07

回答

1

我認爲維基百科解釋非常好:http://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid.27s_algorithm

要計算GCD(48,18),由18除以48得到的2商和12.其餘然後除以12 18得到的1商和6.剩餘然後除以6 12得到的餘數0,這意味着6是最大公約數。請注意,我們忽略了每個步驟中的商數,除非注意何時餘數達到0,表明我們已經到達答案。

所以,在你的算法中,b始終是前一個除法的餘數,以及前一個b。

如果b,新的餘數大於0,它將在if語句中返回true,因此我們忽略a並使用新輸入運行新算法。

1

每次調用遞歸函數時,都會傳入一個新值ba % b)。所以當b達到0時,它會調用return Math.abs(a)

+0

你不可能比這更好地解釋它。非常有意義。 – 2014-11-20 19:24:39