JavaScript中Heap算法中for循环的奇怪行为

时间:2016-04-30 08:08:04

标签: javascript algorithm

我试图实现Heap算法来查找字符串的不同排列,并发现for循环的奇怪行为,这里是代码

function permAlone(str) {

  var strArr = str.split(''),
  permutations = [];

  function swap(strArr, x, y) {
    var tmp = strArr[x];
    strArr[x] = strArr[y];
    strArr[y] = tmp;
  }

  function generate(n) {
    if (n === 1) {
        permutations.push(strArr.join());
    } else {
        for (var i = 0; i != n; i++) {
        generate(n - 1);
        swap(n % 2 ? 0 : i, n - 1);        
      }
    }
  }

  generate(strArr.length);

  return permutations;
}

console.log(permAlone('aab'));

for loop函数中的generate中,如果我输入 i = 0 ,则脚本的输出为 [' a,a, b',' a,a,b'] 但如果我把 var i = 0 输出 [' a, a,b',' a,a,b',' a,a,b',' a,a,b',' a,a,b',' a,a,b']

我理解var i会为循环创建一个局部变量,但在这种情况下不要理解为什么它会改变循环的功能,因为在其他任何地方都没有声明i变量。脚本。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

如果您有一个全局i变量,行为更改的原因是您有多个递归调用generate()所有尝试控制自己的部分完成 for循环相同的变量,并且当它们开始时将i设置回0

想象for循环的第二次迭代会发生什么:i1因为它刚刚递增,但随后立即递归调用generate()启动它自己的循环再次将i设置回0

如果使用var创建局部变量,则每个递归调用中的每个for循环都独立于所有其他循环。

尝试使用调试器逐步执行代码,或尝试将以下内容添加为for循环中的第一行,并观察代码运行时变量会发生什么:

 console.log('n:' + n + '; i: '+i);