2013-07-24 111 views
0

我在JavaScript中有這兩個遞歸函數。 第一個函數按從右到左的順序返回輸入數字的數字 第二個函數按從左到右的順序返回它們。所述第一函數的遞歸中的閉包

function first(n){ 
    if(n > 0){ 
     m = Math.floor(n/10); 
     v = (n - m * 10) + " " + first(m); 
     return v; 
    } 
    return ""; 
} 



function second(n){ 
    if(n > 0){ 
     m = Math.floor(n/10); 
     v = second(m) + " " + (n - m * 10); 
     return v; 
    } 
    return ""; 
} 

結果是所述第二函數的

7 6 1 

結果是

1 16 167 

但我預期這個

1 6 7 

我在PHP測試類似的代碼和JAVA和它的作品好。 推測這個問題出現在Javascript的關閉中。但我不知道如何解決它。

+0

使用「變種」。 – ElLocoCocoLoco

回答

3

這是完全簡單:您使用隱含的全局:

function second(n) 
{ 
    if(n > 0) 
    { 
     m = Math.floor(n/10); 
     //m is changing here ------\\will use lowest value of m 
     v = second(m) + " " + (n - m * 10); 
     return v; 
    } 
    return ""; 
} 

修復的方法是:

function second(n) 
{ 
    if(n > 0) 
    { 
     //make declare it in the scope itself 
     var m = Math.floor(n/10); 
     v = second(m) + " " + (n - m * 10); 
     return v; 
    } 
    return ""; 
} 

這仍然留下您與隱含全球v了。如果我是你,我會宣佈v本地,也

function second(n) 
{ 
    var m, v = ''; 
    n = +(n);//coerce to number 
    if (n > 0) 
    { 
     m = Math.floor(n/10); 
     v = second(m) + ' '+ (n-m*10); 
    } 
    return v; 
} 

此功能工作正常。
這個問題真的沒有帶密封蓋這樣做的,但它是由the way JS resolves expressions/names引起的。 這對夫婦,JS如何處理遞歸函數,你得到你得到的輸出,簡單明瞭。

JS並沒有真正有一個遞歸調用堆棧,但。上次我檢查時,遞歸調用實際上是短路的(〜= goto's)。我記得Douglas Crockford在這個主題上讀到了一些關於它與調用堆棧有關的東西。
雖然ES5的嚴格模式不引進TCO,並應在2013年(ES6 - 和諧)結束做到這一點。我已經掛了幾個網站here的,如果你關心你的內部函數變量之前閱讀更多關於此事

+0

謝謝。現在它工作正確。 – jangofett

+0

@jangofett:不客氣,儘管如此,感謝某人幫助您投票/接受答案的方式,而不是張貼感謝評論 –