Javascript:作为参数传递的数组不保留值

问题描述 投票:0回答:1

我正在尝试使用 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);
javascript algorithm subset powerset
1个回答
0
投票

这里的问题是您将对

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);

© www.soinside.com 2019 - 2024. All rights reserved.