javascript - 为什么我的变量引用全局范围变量?

标签 javascript arrays reference

我尝试编写一个函数来查找给定数字数组的所有可能排列。这是我的代码。

var perm = [];
var usedchar = [];

function findAllPermutations(arr) {

  for (var i = 0; i < arr.length; i++) {
    var x = arr.splice(i,1)[0];
    usedchar.push(x);

    if (usedchar.length == 3) {
      perm.push(usedchar);
    }

    findAllPermutations(arr);
    usedchar.pop();
    arr.splice(i,0,x);
  }
}

findAllPermutations([1,2,3]);

console.log(perm); //-> [[],[],[],[],[],[]]

我希望得到:

[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

有人可以解释为什么我没有得到这个答案吗?

最佳答案

您正在使用保存中间结果的同一个数组作为算法的存储,但事情变得困惑了。您需要将两者分开,或者确保在将 usedchar 数组插入 perm 数组之前克隆它。像这样的傻瓜:http://plnkr.co/edit/HQ6q8fo8S0K21cISQKVt

  var perm = [];
  var usedchar = [];
  var another = [];

  function findAllPermutations(arr) {


  for (var i = 0; i < arr.length; i++) {
    var x = arr.splice(i,1)[0];
    usedchar.push(x);

    if (usedchar.length == 3) {
      perm.push(usedchar.slice());
    };

    findAllPermutations(arr);
    usedchar.pop();
    arr.splice(i,0,x);
  };
};

findAllPermutations([1,2,3]);
console.log(perm);

关于javascript - 为什么我的变量引用全局范围变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32194211/

相关文章:

javascript - 如何在 JavaScript 中传递参数名称?

javascript - ruby on Rails 中使用 sweetalert 删除方法

php explode - 需要第二个元素

C++ 指向 unordered_map 条目的指针发生变化,但条目没有

javascript - Vue2 - 将普通 ONKEYPRESS 函数转换为方法

javascript - PHP/HTML 模式警报

javascript - 数组如何按两个属性分组?

Javascript 编码测验未加起来

c++ - 传递给函数时如何使结构为空?

Javascript 通过引用或值传递变量