2013-08-05 18 views
0

嗨,我是一個試圖學習遞歸的初學者。如果arr包含[4,6,23,10,1,3]輸出應該返回true,因爲4 + 6 + 10 + 3 = 23,我試圖在ArrayAdditionI(arr)中編寫關於組合算法的函數。23數組中的最大數量。如果沒有組合給出23,則該函數返回false。在javascript中返回或拋出遞歸算法的差異

在我的代碼中,我試圖使用返回,但沒有工作,然後我改變它扔它的作品。 我明白爲什麼投擲作品,但很困惑爲什麼回報不起作用。

這裏是我的js代碼工作:

function ArrayAdditionI(arr) { 

//remove the maximal number from arr 

var m = arr[0]; 
for (var i=0; i<arr.length-1;i++) 
m = Number(arr[i]) > Number(arr[i+1]) ? arr[i]:arr[i+1]; 
arr.splice(arr.indexOf(m),arr.indexOf(m)); 

//Here the recursion starts: 

var combiAdd = function (a){ 
    var sum = 0; 
    for (var j=0; j<a.length;j++){ 
    sum += a[j]; 
    if (sum == m) 
     throw true; 
    else if (sum != m && j==a.length-1){ 
     if (a.length == 1) 
     throw false;//switch to the "return false;" 
     else 
     combiAdd(a.splice(1,a.length));//switch to "return combiAdd(a.splice(1,a.length)); 
    } 
    }   
}  

try { 
    combiAdd(arr); 
    } 
catch(exp){ 
if (exp !=true && exp!=false) 
    throw exp; 
else 
    return exp;} 
} 

這裏是我的代碼與回報不工作:

//...same code as above 
    if (a.length == 1) //same code 
     return false; 
    else 
     return combiAdd(a.splice(1,a.length)); 

它給了我不確定消息的所謂虛假陣列狀[ 4,7,10,1]

任何人都可以幫助我嗎?謝謝!

+0

你確實有'返回combiAdd(a.splice(1,則爲a.length));'在你的實際代碼,而不僅僅是'combiAdd(a.splice(1,則爲a.length));' , 對?最可能的錯誤似乎是你忘了放'return',但是當你寫你的StackOverflow後,你記得返回值。 – user2357112

+0

你可能想'arr.splice(arr.indexOf(m),1);'而不是'arr.splice(arr.indexOf(m),arr.indexOf(m));'。第二個參數是一個元素數,而不是元素索引。 –

回答

0

您可以簡化您的代碼。

function ArrayAdditionI(arr) { 
    var sum = 0, max; 

    // remove the biggest number 
    // and put the max number in a variable 
    max = arr.splice(arr.indexOf(Math.max.apply(null, arr)), 1)[0]; 

    // add the remaining numbers 
    sum = arr.reduce(function (a, b) { return a + b; }); 

    return sum === max; 
} 
+0

「我是一個初學者,試圖學習遞歸。」 – Ryan

+0

我意識到這一點,但他所做的事情太複雜了。有更好的方法來學習遞歸。 –