Javascript 为什么我的置换算法对所有置换都给出相同的结果?

Javascript 为什么我的置换算法对所有置换都给出相同的结果?,javascript,arrays,algorithm,heap,permutation,Javascript,Arrays,Algorithm,Heap,Permutation,这是我第一次问自己一个问题。我总是能找到解决大多数问题的答案,但这次我被一些堆的排列算法所困扰。我已经尝试解决这个挑战一段时间了,但没有成功,所以我来找你们,你们比我有更好的编程知识 我编写了一些Javascript代码,以递归方式查找值的所有可能排列:数组或字符串。当我控制台.log()处理被置换的值时,我的代码似乎工作得很好,但当我将它们推送到另一个数组时,所有这些值都得到了相同的值。我很困惑。也许我在做傻事,谁知道呢。任何帮助都将不胜感激,感谢高级人员 我的代码包含两个独立的函数:一个用于

这是我第一次问自己一个问题。我总是能找到解决大多数问题的答案,但这次我被一些堆的排列算法所困扰。我已经尝试解决这个挑战一段时间了,但没有成功,所以我来找你们,你们比我有更好的编程知识

我编写了一些Javascript代码,以递归方式查找值的所有可能排列:数组或字符串。当我控制台.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);
        }
    }
};
arr=[“a”、“b”、“c”];
newArr=[];
//这里的交换机制
功能交换(arr、pos1、pos2){
var-temp=arr[pos1];
arr[pos1]=arr[pos2];
arr[pos2]=温度;
};
函数perm(arr、nArr、n){
n=n | |棱长;
如果(n==1){
console.log(arr);//console.log()工作得很好
newArr.push(arr);//推送已置换的值不会
}
否则{

对于(var i=1;i这是一个简单的(堆)引用vs.(堆栈)值问题。原因很简单:
arr
在所有递归调用中都引用内存中的相同数组。因此,当调用
newArr.push(arr)时
对同一对象的另一个引用被添加到结果列表中。当您执行
交换
时,您可以交换
newArr
的所有元素,因为它们指向同一数组。有关可能的解决方法,请参阅。(基本上使用方法创建独立副本)。

这是简单的(堆)引用与(堆栈)值问题。原因很简单:
arr
在所有递归调用中引用内存中的相同数组。因此,当调用
newArr.push(arr)时
对同一对象的另一个引用被添加到结果列表中。当您执行
交换
时,您可以交换
newArr
的所有元素的元素,因为它们指向同一数组。有关可能的解决方法,请参阅。(基本上使用方法创建独立副本).

欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。欢迎使用StackOverflow.p请阅读并遵循帮助文档中的发布指南。适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。非常感谢您,兄弟。我很困惑,但我想我很抱歉理解问题所在。一个简单的问题:console.log()为什么会显示所有置换的值?我不太理解这一部分。@wadsonfourien,
console.log
在执行时显示当前值。此时(唯一)数组处于您想要的状态(并且
newArr
中的所有引用都指向处于该状态的同一数组)。但是当您下次调用
swap
时,您将修改该数组(相同)数组及其状态现在与您上次记录的不同。设置一个断点并在第3次或第4次迭代时查看
newArr
可能会有所帮助,以查看它如何包含对同一内存的多个引用。非常感谢您,兄弟。我很困惑,但我想我理解问题所在。快速问一下uestion:console.log()为什么会显示所有置换的值?我不太明白这一部分。@wadsonfourien,
console.log
在执行时显示当前值。此时(唯一)数组处于您想要的状态(并且
newArr
中的所有引用都指向处于该状态的同一数组)。但是,当您下次修改该(同一)数组时调用
swap
,它的状态现在与上次记录的状态不同。设置断点并在第3次或第4次迭代时查看
newArr
,查看它如何包含对同一内存的多个引用,可能会有所帮助。