2013-10-09 64 views
0

我在JavaScript中寫了下面的程序:不理解JavaScript的遞歸程序

function recursiveSum(a) { 
    sum = 0; 
    for (i=0;i<a.length; ++i) { 
     if (typeof a[i] === "number") { 
      sum += a[i]; 
     } else if (a[i] instanceof Array) { 
      sum += recursiveSum(a[i]); 
     } 
    } 
    return sum; 
} 
function arraySum(a) { 

    // i will be an array, containing integers, strings and/or arrays like itself. 
    // Sum all the integers you find, anywhere in the nest of arrays. 

    return recursiveSum(a); 
} 

而且我想不通的arraySum([[1,2,3],4,5])is 6爲什麼結果。爲什麼第一個數組之後的元素沒有被處理?

+2

您的'sum' var定義在哪裏?它可能不是本地的功能。 –

+1

我是JavaScript的初學者,並且正在編寫與其他語言相關的代碼。我忘了把'var'放在變量前面,所以我的變量是全局的,就像答案建議的那樣。 –

+0

只要可以,請鍵入「嚴格使用」; 在所有js文件的開頭。它不允許沒有'var'的buggy樣式全局變量。 –

回答

7

全局變量有問題。您需要使用var,它不是可選的。

兩個sumi需要與var聲明。

var sum = 0; 
for (var i=0;i<a.length; ++i) { 
4

sumi變量是全局的,因爲你還沒有宣佈他們作爲本地的功能。你正在墮入The Horror of Implicit Globals。這主要是i變量導致您的特定輸入出現問題:由於a中的第一項是一個數組,i通過遞歸調用增加,並且數組中的最後兩項不會由外部調用處理。 (但如果你使用[1, 2, [3, 4, 5]],事實呼叫同時共享isum會造成麻煩。)

var在他們每個人的面前。同時考慮使用新的嚴格模式,這會造成一個有用的錯誤。