javascript - 递归的子集和 - 我做错了什么?

标签 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。 非常感谢你的帮助:)

最佳答案

您需要获取 current 的副本,并且需要返回包含值的数组。不幸的是,您向结果集中添加了太多的零。

因此我建议在调用函数find的地方添加一个值。

您可以在 find 中省略 target,因为您已经对它进行了闭包。

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]));

关于javascript - 递归的子集和 - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393304/

相关文章:

javascript - 如何从 Ajax FormData.append 访问变量?

java - 为什么导致 StackOverflowError 的递归方法的调用次数在程序运行之间会有所不同?

javascript - 从数据库记录生成递归 JSON

javascript - 构造可变属性名的JS对象的简写方式

javascript - 输入光标在输入事件时跳转到输入字段的末尾

javascript - 防止 Node.js repl 打印输出

javascript - 如何向前而不是向后添加文本

android - 修改大字符串的内容

xml - XSLT:基于 2 个子元素的元素的数学加法

javascript - 为什么这个递归在 Javascript 上不起作用?