2016-09-22 51 views
-1

我已经在JavaScript中实现了Heap的非递归算法。 当检查排列与console.log(arr)一切都按预期工作。 但是当我尝试将每个排列推送到一个结果数组时,然后所有东西都打散了。它只是返回填充最后一次迭代排列的结果。 Javascript堆的算法(非递归)

function generate(n, arr) { 
 
\t function swap(item1, item2){ 
 
\t \t console.log(item1, item2); 
 
\t \t let tmp = arr[item1]; 
 
\t \t arr[item1] = arr[item2]; 
 
\t \t arr[item2] = tmp; 
 
\t } 
 
\t var c = []; 
 
\t var allPermutations = []; 
 
\t 
 
\t for (let i = 0; i < n; i++) { 
 
\t \t c[i] = 0; 
 
\t } 
 
\t 
 
\t console.log(arr); 
 
\t allPermutations.push(arr); 
 
\t 
 
\t for (let i = 1; i < n; i) { 
 
\t \t if (c[i] < i) { 
 
\t \t \t if (i % 2 == 0) { 
 
\t \t \t \t swap(0, i); 
 
\t \t \t } else { 
 
\t \t \t \t swap(c[i], i); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t console.log(arr); 
 
\t \t \t allPermutations.push(arr); 
 
\t \t \t 
 
\t \t \t c[i] += 1; 
 
\t \t \t i = 1; 
 
\t \t } else { 
 
\t \t \t c[i] = 0; 
 
\t \t \t i += 1; 
 
\t \t } 
 
\t } 
 
\t 
 
\t return allPermutations; 
 
} 
 

 
console.log('result', generate(3, ["a", "a", "b"]));

+2

您必须阅读[问]并修复您的文章! – Amit

+0

你不会费心去削减代码。我不能打扰遵循链接 –

+0

@EdHeal是静态输出比repl更好... –

回答

1

的问题是,数组只是引用,所以当你你只是推对它的引用数组中的推动。因此,在下一次迭代中,您更新数组,并且在查看最终输出时,所有索引将相同,因为它们是相同的数组。

那么你能做什么?克隆它。

allPermutations.push(arr.slice(0)); 
+0

是的!我完全忘了它!谢谢! –