JavaScript 递归

标签 javascript recursion sum subset

目标是找出数组中整数的任意组合是否等于数组中的最大整数。

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,但它会继续递归。谁能解释一下?

最佳答案

最后的 or 条件使函数检查所有组合。

该函数从数组中剔除一个数字,然后检查是否可以找到没有该数字或有该数字的解。

例如,如果您有数组 [1,2,3,6] ,让我们按照找到解决方案的递归部分进行操作。代码会先挑出6作为最大的,然后调用递归函数寻找总和 6[1,2,3] .

函数将剃掉1 ,然后检查总和是否为 6可以在 [2,3] 中找到,或者如果总和 5 (6-1) 可以在[2,3]中找到.

第二种情况的递归调用将剃掉2从数组中,然后检查总和 5可以在 [3] 中找到,或者如果总和 3 (5-2) 可以在 [3] 中找到.

第二种情况的递归调用将剃掉3从数组(留空),然后检查是否 3可以在 [] 中找到,或者如果 0 (3-3) 可以在 [] 中找到.

第二种情况的递归调用会匹配函数开头的条件,返回true .

关于JavaScript 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26284612/

相关文章:

java - 如果我的递归方法返回true,为什么它会进入递归调用?

oracle - oracle 中的求和值

haskell - 在 Haskell 中将 1 到 1,000,000 相加会导致堆栈溢出。引擎盖下发生了什么?

mysql - 根据总和排序

javascript - 仅将此元素用于多个元素中的 ng-click

Javascript 返回值未定义

c++ - 陷入无限循环(骑士之旅问题)

c - 递归调用 pipeline() 后 I/O 挂起

javascript - 如何ajax仅加载html而不加载图像?

javascript - 滥用 CSS 类属性或有效的设计模式?