如何修改数组组合求和脚本,实现元素仅使用一次?
解决元素仅使用一次的组合求和问题
你的问题核心是原脚本允许重复选取同一个数组元素,导致出现不符合需求的组合。只需要修改递归调用的参数,确保每选一个元素后,后续只能从下一个元素开始选择,就能实现每个元素仅使用一次的限制。
修改后的代码
const arr = [144, 35, 20, 10]; const sum = 65; const findSum = (arr, sum) => { const res = []; const search = (index, part = []) => { const s = part.reduce((a, b) => a + b, 0); if (s === sum) { res.push([...part]); // 创建数组副本,避免引用修改 }; if (s >= sum || index >= arr.length) { return; }; // 选当前元素后,递归从下一个索引开始,禁止重复选取当前元素 search(index + 1, part.concat(arr[index])); search(index + 1, part); }; search(0); return res; } console.log(findSum(arr, sum)); // 输出: [[35, 20, 10]]
关键修改说明
原代码中search(index, part.concat(arr[index]))的问题在于,递归时仍传入当前index,导致可以反复选取同一个元素。修改为search(index + 1, part.concat(arr[index]))后:
- 当选择当前元素
arr[index]时,下一次递归直接从index+1的位置开始遍历,确保当前元素不会被重复选取 - 不选当前元素的分支保持
search(index + 1, part),继续遍历后续元素
另外,将res.push(part)改为res.push([...part])是为了创建数组的副本,避免后续递归操作修改已存入结果数组的引用内容(原代码中当前场景虽无问题,但这是更严谨的写法)。
内容的提问来源于stack exchange,提问作者OUED
相关产品推荐
相关产品推荐

