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

时间:2014-10-06 02:23:33

标签: javascript combinations permutation

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

我不完全确定在完成所有组合后,我会如何在数组中附加所有项目。

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

示例:

2 个答案:

答案 0 :(得分:2)

那么,你是不是想做这样的事情: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 ] ]

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

答案 1 :(得分:1)

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

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