【问题标题】:How would I append all the combinations in a list?如何将所有组合附加到列表中?
【发布时间】:2014-10-06 02:23:32
【问题描述】:
var combinations = function(numArr, choose, callback) {
    var n = numArr.length;
    var c = [];
    var inner = function(start, choose_) {
        if (choose_ == 0) {
            callback(c);
        } else {
            for (var i = start; i <= n - choose_; ++i) {
                c.push(numArr[i]);
                inner(i + 1, choose_ - 1);
                c.pop();
            }
        }
    }
    inner(0, choose);
}

我不完全确定在创建完所有组合后如何将所有项目附加到数组中。

我尝试对代码进行一些修改,但最终搞砸了。

例子:

【问题讨论】:

标签: javascript combinations permutation


【解决方案1】:

那么,您是否尝试这样做:http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/

我发现双循环实现可以很好地完成任务:

function findCombinations(nums, cb) {
    var allCombinations = [];
    var maxIndex = nums.length - 1;
    var i = 0, j = 0;
    for (i; i <= maxIndex; i += 1) {
        for (j = i; j <= maxIndex; j += 1) {
            if (i !== j) {
                allCombinations.push([ nums[i], nums[j] ]);
            }
        }
    }
    cb(allCombinations);
}

findCombinations([1, 2, 3, 4], function (combinations) {
    console.log(combinations);
});

打印输出:

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

您是否专门尝试实现递归树?

【讨论】:

  • 不完全是,我需要它能够改变组合的数量,而不是 2 我需要它在 3 个组合中。我想我可以按照您的示例并添加我想的递归。我希望能够修改每个组合中的元素数量*
【解决方案2】:

如果这是正确的输出,我可以对您的解决方案进行小幅修复。 你的方法是完全正确的。您只需要考虑何时开始/结束 组合。当组合结束时,您需要将当前组合推送到外部数组。 您的基本情况表示组合何时完成,此时您需要推送当前组合的副本。

> combinations([0,1,2,3],2)
[ [ 0, 1 ],
  [ 0, 2 ],
  [ 0, 3 ],
  [ 1, 2 ],
  [ 1, 3 ],
  [ 2, 3 ] ]
> combinations([0,1,2,3],3) 
[ [ 0, 1, 2 ],
  [ 0, 1, 3 ],
  [ 0, 2, 3 ],
  [ 1, 2, 3 ] ]

这是经过调整的解决方案。如果您愿意,可以使用c 上的回调。

function combinations(numArr, choose, callback) {
    var n = numArr.length;
    var c = [];
    var temp = [];
    var inner = function(start, choose_) {
        if (choose_ === 0) {
            c.push(temp.slice());
        } else {
            for (var i = start; i <= n - choose_; i++) {
                temp.push(numArr[i]);
                inner(i + 1, choose_ - 1);
                temp.pop();
            }
        }
    }
    inner(0, choose);
    return c;
}

【讨论】:

  • 这是正确的输出,虽然我有点遵循我在网上看到的算法,但我不完全知道如何在结束时将它们全部一起输出......
猜你喜欢
  • 2022-08-19
  • 2011-05-03
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多