2013-03-31 94 views
2

我已經寫了一個簡單的腳本,使用遞歸方法 - 歐幾里德算法來尋找最大公約數(GCD)和最小公倍數(LCM)。變量在遞歸JavaScript函數中變得未定義?

不幸的是,如果需要在多個步驟中執行此操作,則從該函數返回的相關變量變得未定義。我試着在一個帶有斷點的調試器中跟着它,它似乎完全按照遞歸進行,並且適當地返回到原始函數,但是它在函數的末尾神祕地消失了,即使它要返回?

不知道爲什麼會發生這種情況,或者我可以做些什麼來解決它。我的代碼如下:

function GCD(a, b) { 
    if (a % b == 0) { 
     return b; 
    } 
    else { 
     GCD(b, (a % b)); 
    } 
} 

function LCM (a, b) { 
    return (a*b)/GCD(a, b); 
} 

function makeDM (a, b) { 
    return (GCD(a, b) + " " + LCM(a, b)); 
} 

因此,如果您使用的是& b,如60,20,它會給20的正確答案和60.不過,如果您使用的數字,如20,60或126,這35悲慘地失敗了。

+0

我貼你的代碼嘗試在http://ideone.com/,和它給我的警告第2行:使用'==='與0進行比較。 –

+4

'GCD'中的一條路徑中沒有'return'。這很腥。 – Mat

+0

這是你要做的 - > [** FIDDLE **](http://jsfiddle.net/wEv8Y/)?? – adeneo

回答

7

您沒有從函數的遞歸部分返回值,所以從函數返回的值將是undefined。添加return

function GCD(a, b) { 
    if (a % b == 0) { 
     return b; 
    } 
    else { 
     return GCD(b, (a % b)); 
    } 
} 

你也可以用單一return這樣寫:

function GCD(a, b) { 
    return a % b == 0 ? b : GCD(b, (a % b)); 
} 
+0

完美!非常感謝,我知道我必須錯過一些完全基本的嘿嘿:) – Tomcat