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
相关产品推荐
相关产品推荐

