0

我坚持使用一些堆的排列算法。我编写了一些 JavaScript 代码以递归方式查找值的所有可能排列:数组或字符串。当我置换值时,我的代码似乎可以完美运行,console.log()但是当我将它们推送到另一个数组时,我得到的所有值都相同。我很困惑。

我的代码包含两个独立的函数:一个是交换元素,另一个是递归查找可能的排列:

arr = ["a", "b", "c"];
newArr = [];

// swap mechanism here
function swap(arr, pos1, pos2) {
    var temp = arr[pos1];
    arr[pos1] = arr[pos2];
    arr[pos2] = temp;
};

function perm(arr, nArr, n) {
    n = n || arr.length; 
    if (n === 1) {
        console.log(arr); // console.log() works great
        newArr.push(arr); // pushing the permuted values does not
    }
    else {
        for(var i = 1; i <= n; i += 1) {
            perm(arr, nArr, n - 1);
            if (n % 2) {
                var j = 1;
            }
            else {
                var j = i;
            }
            swap(arr, j - 1, n - 1);
        }
    }
};
4

1 回答 1

2

这是一个简单的(堆)引用与(堆栈)值的问题。原因很简单:arr在所有递归调用中都引用内存中的同一个数组。因此,当您调用newArr.push(arr)对同一对象的另一个引用时,会将其添加到结果列表中。当你这样做时swap,你会交换所有元素的元素,newArr因为它们指向同一个数组。另请参阅在 JavaScript 中按值复制数组以了解可能的解决方法。(基本上使用Array.slice方法来创建一个独立的副本)。

于 2017-08-10T21:26:47.673 回答