【问题标题】:Why is my solution for the powerset question incorrect? I have included my recursive and iterative approach [duplicate]为什么我对 powerset 问题的解决方案不正确?我已经包括了我的递归和迭代方法[重复]
【发布时间】:2020-09-07 20:56:16
【问题描述】:

问题基本上是在给定一个唯一整数数组的情况下生成所有子集。

例如powerSet[1,2,3] 应该返回[[], [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3]]

这是我的递归尝试:

function powerset(array) {
  // Write your code here.
    let set = [[]];
    powersetHelper(array, [], set);
    return set;
}

function powersetHelper(array, subset, set) {
    if (array.length === 0) return;
    for (let i = 0; i < array.length; i++) {
        subset.push(array[i]);
        set.push(subset);
    }
    let newArr = array.slice(1);
    powersetHelper(newArr, [], set)
}

为什么这会返回 [[], [1, 2, 3], [1, 2, 3], [1, 2, 3], [2, 3], [2, 3], [3]] 而不是正确的解决方案?

此外,我反复尝试如下:

function powerset(array) {
  // Write your code here.
    let subset = [];
    let set = [[]];
    while (array.length > 0) {
        for (let j = 0; j < array.length; j++) {
            let num = array[j];
            subset.push(num);
            set.push(subset);
        }
        array = array.slice(1);
    }
    return set;
}

这也是不正确的,并且以某种方式返回了我在下面的内容,即使它似乎与我的递归解决方案的逻辑相同

[
  [],
  [1, 2, 3, 2, 3, 3],
  [1, 2, 3, 2, 3, 3],
  [1, 2, 3, 2, 3, 3],
  [1, 2, 3, 2, 3, 3],
  [1, 2, 3, 2, 3, 3],
  [1, 2, 3, 2, 3, 3]
]

【问题讨论】:

    标签: javascript arrays algorithm recursion


    【解决方案1】:

    您需要在没有对象引用的情况下进行复制。

    function powerSet(array) {
        // Write your code here.
        let set = [[]];
        powersetHelper(array, [], set);
        return set;
    }
    
    function powersetHelper(array, subset, set) {
        if (array.length === 0) return;
        for (let i = 0; i < array.length; i++) {
            subset.push(array[i]);
            set.push([...subset]); // take copy without object reference
        }
        let newArr = array.slice(1);
        powersetHelper(newArr, [], set)
    }
    
    console.log(powerSet([1, 2, 3])); // [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    第二个,同样的问题

    function powerSet(array) {
        // Write your code here.
        let subset = [];
        let set = [[]];
        while (array.length > 0) {
            for (let j = 0; j < array.length; j++) {
                let num = array[j];
                subset.push(num);
                set.push([...subset]);
            }
            array = array.slice(1);
        }
        return set;
    }
    
    console.log(powerSet([1, 2, 3])); // [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 两个输出仍然错误:)
    • 我用同样的逻辑想通了。你是对的,我正在将一个对子集的引用推送到不起作用的集合中。我必须在那一刻推动那个实际的子集,并且不允许它被改变。我在上面的编辑中包含了我的工作解决方案,这与您的非常相似(我只是将其切片以制作副本而不是扩展运算符)
    • 其实这个方案还是错的,因为它实际上并没有得到[1,3]的情况
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 2022-09-25
    • 2011-09-08
    • 1970-01-01
    • 2017-01-30
    • 2013-07-22
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多