-1

我已经在 J​​avaScript 中实现了 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"]));

4

2 回答 2

1

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

所以,你可以做什么?克隆它。

allPermutations.push(arr.slice(0));
于 2016-09-22T20:39:51.997 回答
0

是的 - 这是一个参考问题。替代 epascarello 的答案:

allPermutations.push([...arr]);
于 2020-04-22T21:02:00.980 回答