对于Javascript中的Heap算法,array.push产生的结果与console.log不同

时间:2016-11-08 21:34:59

标签: javascript arrays

我正在尝试使用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');

1 个答案:

答案 0 :(得分:1)

您只有一个数组(不计算allArrays),因此您已将同一个数组推入allArrays六次。

在推送之前,您应该复制一个数组。您可以使用slice

执行此操作
allArrays.push(array.slice(0));