我正在尝试使用Heap算法为给定字符串创建所有排列的数组。当我使用console.log进行测试时,该函数会打印正确的数组结果。但是,当我尝试将所有数组推送到一个新数组时,它每次都会推送相同的初始数组。
在这个例子中,它推动了[a,a,b] 6次。
首先,为什么要这样做?其次,我如何绕过它并将所有正确的结果推送到我的新阵列中。
function permAlone(str) {
//make str into array
var arr = str.split('');
var allArrays = [];
//Heap's Algorithm to make new array with all permutations
var swap = function (array, pos1, pos2) {
var temp = array[pos1];
array[pos1] = array[pos2];
array[pos2] = temp;
};
var permute = function(array, n) {
n = n || array.length;
if (n === 1 ) {
console.log(array);
//allArrays.push(array);
}
else {
for (var i=1; i <= n; i += 1) {
permute(array, n-1);
if (n%2) {
var j=1;
}
else {
j=i;
}
swap(array, j-1, n-1);
}
}
};
permute(arr);
//console.log(allArrays);
}
permAlone('aab');
答案 0 :(得分:1)
您只有一个数组(不计算allArrays
),因此您已将同一个数组推入allArrays
六次。
在推送之前,您应该复制一个数组。您可以使用slice:
执行此操作allArrays.push(array.slice(0));