You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改数组组合求和脚本,实现元素仅使用一次?

解决元素仅使用一次的组合求和问题

你的问题核心是原脚本允许重复选取同一个数组元素,导致出现不符合需求的组合。只需要修改递归调用的参数,确保每选一个元素后,后续只能从下一个元素开始选择,就能实现每个元素仅使用一次的限制。

修改后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:01:09