Javascript堆's算法(非递归)
Javascript Heap's algorithm (non-recursive)
我已经在JavaScript中实现了Heap的非递归算法。当用console.log(arr)
检查排列时,一切都如预期的那样工作。但是当我尝试将每个排列推入结果数组时,一切都中断了。它只返回最后一次迭代排列的结果。
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]);
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 为递归算法添加一个记忆
- javascript中递归复制二维数组的算法
- JavaScript 非递归排列算法性能
- 解释递归在确定二叉树深度的算法中是如何工作的
- 用javascript制作递归回溯算法的动画
- 为什么这个递归算法在JS中不起作用?
- 返回语句在递归javascript算法,如何返回所有的方式堆栈
- 将递归算法转换为迭代算法的困难
- DFS算法继续递归调用,不返回
- 递归算法,用于替换整数列表中单个给定整数的每个实例
- Javascript堆's算法(非递归)