我正在尝试使用 Javascript 解决问题 Subsets。任务是打印幂集,即数组中的所有子集。在下面的函数中,我传递一个数组作为参数来收集所有子集,但是当我打印时,我只找到除空数组之外的所有子集。
为什么数组all_sets不保留元素?如何修改函数参数以保留元素?
function generate(nums, curr_index, temp, all_sets)
{
if(curr_index === nums.length)
{
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
数组在递归调用中被修改,因此当您将其推送到 all_sets
时,它最终会变为空。修复方法非常简单。将 temp
的副本而不是参考推入 all_sets
。比如:
function generate(nums, curr_index, temp, all_sets)
{
if(curr_index === nums.length)
{
all_sets.push([...temp]); // <--- here
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);