我正在尝试解决该问题,以进行递归思考的实践:给定目标数字和数字数组,请确定是否存在总和为目标数字的数组元素组合。我对此并不陌生,我已经尝试了所有我能想到的东西。我的逻辑有问题吗?还是我忘记了一些简单的事情?这是我的代码:
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。 非常感谢您的帮助:)
答案 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]))