JavaScript 排列函数 - 为什么它不起作用?

JavaScript permutations function - why isn't this working?

我正在尝试在 JavaScript 中编写一个函数,通过移植 Python 文档中的 code 来生成给定数组的排列数组 itertools.permutations. (我知道实际函数是用 C 语言编写的)这就是我所拥有的,它输出一个长度正确的数组 - n!/(n-r)!,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;
}

python 代码有(靠近底部):

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

如果没有它,indices 将永远不会被使用,这应该是一个线索。