繁体   English   中英

Javascript计算排列-当我不复制数组时,为什么我的代码返回不需要的解决方案?

[英]Javascript computing permutations - why is my code returning unwanted solution when I don't make a copy of the array?

以下是返回给定数组的所有排列的函数的代码。

function getAllPerms(s) {
  var perms = [];
  if (s.length === 1) {
    perms.push(s);
    } else {
        for (var i = 0; i < s.length; i++) {
            var sub = s.slice(0);
            sub.splice(i, 1);
            var sp = getAllPerms(sub);
            for (var o = 0; o < sp.length; o++) {
                sp[o].unshift(s[i]);
                perms.push(sp[o]);
            }
        }
    }
    return perms;
  }
  console.log(getAllPerms([1,2]));  // result is [[1, 2], [2, 1]]

但是,如果我不复制该数组并拼接原始数组,则不会得到相同的输出,并且我一直在绞尽脑汁理解为什么? 对我来说,似乎它应该以任何一种方式起作用。 以下是更改原始数组的代码。

function getAllPerms(s) {
    var perms = [];
    var len = s.length
    if (s.length === 1) {
        perms.push(s);
    } else {
        for (var i = 0; i < len; i++) {
            var digit = s[i];
            s.splice(i, 1);
            var sp = getAllPerms(s);
            for (var o = 0; o < sp.length; o++) {
                sp[o].unshift(digit);
                perms.push(sp[o]);
            }
        }
    }
    return perms;
}
console.log(getAllPerms([1,2])); // result is [[2, 1], [2, 1]]

对于第一组代码,我得到正确的结果,[[1,2],[2,1]],但是对于第二部分代码,我得到了奇怪的结果,[[2,1],[2,1] ]。 无法为我的生活弄清楚发生了什么事。

当您运行更改原始数组的代码时,实际上是将输入数组s修改为首先[1,2]然后是[2,1] ,而返回数组只是原始数组s多次,因此修改成为第二个元素的s也会将其修改为第一个元素。

通过运行以下命令,您可以更简单地看到效果:

var x = [1,2]
var p = []
p.push(x)
x[0] = 2
x[1] = 1
p.push(x)

观察每行之后xp变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM