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

JavaScript数组参数丢失值:子集生成函数异常排查与修复

解决LeetCode Subsets问题中all_sets为空的问题

问题原因

你代码的核心问题出在数组的引用传递特性上:递归过程中你一直复用同一个temp数组,每次往all_sets里push的都是这个数组的引用,而非当前temp状态的副本。当整个递归流程结束时,temp经过多次pop操作已经回到初始的空数组状态,所以all_sets里的所有元素其实都是指向同一个空数组的引用,打印结果自然全是空。

修改方案

在递归终止的分支中,不要直接push原temp数组,而是push它的副本。JavaScript里可以用扩展运算符[...temp]或者temp.slice()创建新数组,这样每次保存的都是当前temp的快照,后续对原temp的push/pop操作不会影响已经存入all_sets的子集。

修改后的完整代码:

function generate(nums, curr_index, temp, all_sets) {
  if (curr_index === nums.length) {
    // 改为push temp的副本,保存当前状态
    all_sets.push([...temp]);
    return;
  }

  temp.push(nums[curr_index]);
  generate(nums, curr_index + 1, temp, all_sets);
  temp.pop();
  generate(nums, curr_index + 1, temp, all_sets);
}

function generateAllSubsets(nums) {
  let all_sets = [];
  generate(nums, 0, [], all_sets);
  return all_sets;
}

let all_sets = generateAllSubsets([1, 2, 3, 4]);
console.log(all_sets);

这样修改后,递归终止时会把当前temp的内容复制到新数组再存入all_sets,后续对原temp的修改不会影响已保存的子集,打印就能得到正确的幂集结果。

内容的提问来源于stack exchange,提问作者argcv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:52:10