我将如何在列表中附加所有组合

How would I append all the combinations in a list?

本文关键字:组合 列表      更新时间:2023-09-26
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);
}

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

尝试对代码进行一些修改,尽管最终我把它搞砸了。

例:

那么,您是否正在尝试做这样的事情: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 ] ]

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

如果这是正确的输出,我让它与您的解决方案进行小修复。你的方法是完全正确的。你只需要考虑你什么时候开始/结束一个组合。当组合结束时,您需要将当前组合推送到外部阵列。您的基本情况表示组合何时完成,此时您需要推送当前组合的副本。

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