-1

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"]));

4

2 に答える 2

0

うん - 参照の問題です。エパスカレロの答えの代替:

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