JavaScript排列功能 - 为什么这不起作用?

时间:2017-06-17 02:34:06

标签: javascript python algorithm permutation combinatorics

我正在尝试在JavaScript中编写一个函数,通过在itertools.permutations的Python文档中移植code来生成给定数组的排列数组。 (我知道实际的函数是用C语言编写的)这就是我所拥有的,它输出一个具有正确长度的数组 - n!/(nr)!, n是数组的长度 - 但每个元素只是原始数组,没有重新排列。我很欣赏我的代码,因为我很难过:

function permutations(array, r) {
    if (r === undefined) r = array.length;
    if (r > array.length) return;
    var indices = range(array.length);
    var cycles = range(array.length, array.length - r, -1);
    var result = [[]];
    for (var i = 0; i < r; i++) {
        result[0].push(array[i]);
    }
    while (1) {
        var exhausted = true;
        for (var i = r - 1; i >= 0; i--) {
            cycles[i] -= 1;
            if (cycles[i] == 0) {
                indices = indices.slice(0, i).concat(
                    indices.slice(i + 1)
                ).concat([indices[i]]);
                cycles[i] = array.length - i;
            }
            else {
                var j = cycles[i];
                swap(indices, i, indices.length - j);
                var p = [];
                for (var i = 0; i < r; i++) {
                    p.push(array[i]);
                }
                result.push(p);
                exhausted = false;
                break;
            }
        }
        if (exhausted) break;
    }
    return result;
}

1 个答案:

答案 0 :(得分:0)

python代码(靠近底部):

<br/>

您将其翻译为:

yield tuple(pool[i] for i in indices[:r])

但它应该是:

            for (var i = 0; i < r; i++) {
                p.push(array[i]);
            }
            result.push(p);

如果不这样做, for (var i = 0; i < r; i++) { p.push(array[indices[i]]); } result.push(p); 永远不会被使用,这应该是一个线索。