2014-10-09 108 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