我正在尝试在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;
}
答案 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);
永远不会被使用,这应该是一个线索。