Javascript Heap的算法(非递归)
Javascript Heap's algorithm (non-recursive)
我在JavaScript实现了Heap的非递归算法。
使用 console.log(arr)
检查排列时,一切都按预期工作。
但是当我尝试将每个排列推送到结果数组时,一切都会崩溃。它只是 returns 结果填充了最后一次迭代排列。
function generate(n, arr) {
function swap(item1, item2){
console.log(item1, item2);
let tmp = arr[item1];
arr[item1] = arr[item2];
arr[item2] = tmp;
}
var c = [];
var allPermutations = [];
for (let i = 0; i < n; i++) {
c[i] = 0;
}
console.log(arr);
allPermutations.push(arr);
for (let i = 1; i < n; i) {
if (c[i] < i) {
if (i % 2 == 0) {
swap(0, i);
} else {
swap(c[i], i);
}
console.log(arr);
allPermutations.push(arr);
c[i] += 1;
i = 1;
} else {
c[i] = 0;
i += 1;
}
}
return allPermutations;
}
console.log('result', generate(3, ["a", "a", "b"]));
问题是数组只是引用,所以当你推入数组时,你只是在推一个对它的引用。因此,在下一次迭代中更新数组,当您查看最终输出时,所有索引都将相同,因为它是同一个数组。
那你能做什么?克隆它。
allPermutations.push(arr.slice(0));
是的 - 这是一个参考问题。 epascarello 的替代答案:
allPermutations.push([...arr]);
我在JavaScript实现了Heap的非递归算法。
使用 console.log(arr)
检查排列时,一切都按预期工作。
但是当我尝试将每个排列推送到结果数组时,一切都会崩溃。它只是 returns 结果填充了最后一次迭代排列。
function generate(n, arr) {
function swap(item1, item2){
console.log(item1, item2);
let tmp = arr[item1];
arr[item1] = arr[item2];
arr[item2] = tmp;
}
var c = [];
var allPermutations = [];
for (let i = 0; i < n; i++) {
c[i] = 0;
}
console.log(arr);
allPermutations.push(arr);
for (let i = 1; i < n; i) {
if (c[i] < i) {
if (i % 2 == 0) {
swap(0, i);
} else {
swap(c[i], i);
}
console.log(arr);
allPermutations.push(arr);
c[i] += 1;
i = 1;
} else {
c[i] = 0;
i += 1;
}
}
return allPermutations;
}
console.log('result', generate(3, ["a", "a", "b"]));
问题是数组只是引用,所以当你推入数组时,你只是在推一个对它的引用。因此,在下一次迭代中更新数组,当您查看最终输出时,所有索引都将相同,因为它是同一个数组。
那你能做什么?克隆它。
allPermutations.push(arr.slice(0));
是的 - 这是一个参考问题。 epascarello 的替代答案:
allPermutations.push([...arr]);