子集总和递归-我在做什么错?

时间:2019-01-27 22:04:37

标签: javascript recursion

我正在尝试解决该问题,以进行递归思考的实践:给定目标数字和数字数组,请确定是否存在总和为目标数字的数组元素组合。我对此并不陌生,我已经尝试了所有我能想到的东西。我的逻辑有问题吗?还是我忘记了一些简单的事情?这是我的代码:

function findSolution(target, arr){

  function getSum(total, num) {
    return total + num;
  }

  function find(current, push, target, i){
    current.push(push);

    if (current.reduce(getSum) === target){
      return true;
    } else if (current.length >= arr.length){
      return null;
    } else {
      return find(current, arr[i], target, i+1) || 
             find(current, 0, target, i+1);
    }

  }

return find([], 0, target, 0);

return false;
}


console.log(findSolution(23, [4, 6, 10, 1, 3] ));

以上目标和数组应返回true(4 + 6 + 10 + 3),但返回null。 非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

您需要复制current,并且需要返回带有值的数组。不幸的是,您在结果集中添加了太多零。

因此,我建议在调用函数find的位置添加一个值。

您可以在target中省略find,因为您已经关闭了它。

function findSolution(target, arr) {
    function getSum(total, num) {
        return total + num;
    }

    function find(current, i) {
        if (current.reduce(getSum, 0) === target) { // initialValue for empty arrays
            return current;
        }
        if (i >= arr.length) {
            return null;
        } 
        return find(current.concat(arr[i]), i + 1)
            || find(current, i + 1);
    }

    return find([], 0);
}

console.log(findSolution(23, [4, 6, 10, 1, 3]));

答案 1 :(得分:0)

您需要计算值数组的所有可能组合以找到所有解决方案:

function findSolution(target, arr) {
 
 const combinations = set => set.reduce(
    (subsets, value) => [
      ...subsets,
      ...subsets.map(subset => [value, ...subset])
    ], 
    [ [] ]
  )

  const getSum = (total, num) => total + num

  return combinations(arr).find(current =>
    current.reduce(getSum, 0) === target
  )
}

console.log(findSolution(23, [4, 6, 10, 1, 3]))