2014-10-09 69 views
2

目標是查找數組中整數的任意組合是否等於數組中的最大整數。JavaScript遞歸

function ArrayAdditionI(arr) { 
    arr.sort(function(a,b){ 
    return a - b; 
    }); 
    var largest = arr.pop(); 
    function recursion(target,array){ 
    if(array.length === 0){ 
     return target === 0; 
    } 
    var n = array[0]; 
    array = array.slice(1); 
    return recursion(target,array) || recursion(target - n, array); 
    } 
    return recursion(largest,arr);   
} 

此解決方案似乎可行,但我不能跟着它。在遞歸函數的底部,當它到達OR運算符的右側時,我認爲它幾乎總是返回false,但是它會繼續遞歸。有人可以解釋嗎?

回答

1

這是最後的條件,使功能檢查所有組合。

該函數從數組中刪除一個數字,然後檢查是否有可能找到一個沒有該數字或該數字的孤獨。

例如,如果您有例如數組[1,2,3,6],讓我們來看看找到解決方案的遞歸部分。代碼將首先挑選出6作爲最大值,然後調用遞歸函數查找[1,2,3]中的總和6

功能將剃掉1,然後檢查是否任一的總和6可以[2,3]中找到,或者如果該總和5(6-1)可在[2,3]找到。

的遞歸調用用於所述第二殼體從所述陣列剃掉2,然後檢查是否總和5可以[3]中找到,或者如果該總和3(5-2)可在[3]找到。

的遞歸調用用於所述第二殼體從所述陣列剃掉3(離開它是空的),然後檢查是否3可以[]中找到,或者如果0(3-3)可在[]找到。

第二種情況的遞歸調用將匹配函數開頭的條件,並返回true

+0

好的。我沒有意識到它正在保存變量值,因爲它繼續執行or運算符的左側。它是否由於沒有完成聲明而造成封閉?或者只是在調用堆棧中進行備份?或兩者? – 2014-10-11 01:04:14

+0

@MattLarsh:參數和'n'變量在函數中是局部的,所以每次調用函數都會得到它們自己的一組函數。到底如何在Javascript中實現沒有定義,但它與調用堆棧中的參數相同,並且在棧中爲'n'變量生成空間。 – Guffa 2014-10-11 09:56:34