我试图实现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
变量。脚本。
感谢任何帮助。
答案 0 :(得分:2)
如果您有一个全局i
变量,行为更改的原因是您有多个递归调用generate()
所有尝试控制自己的部分完成 for循环相同的变量,并且当它们开始时将i
设置回0
。
想象for循环的第二次迭代会发生什么:i
是1
因为它刚刚递增,但随后立即递归调用generate()
启动它自己的循环再次将i
设置回0
。
如果使用var
创建局部变量,则每个递归调用中的每个for循环都独立于所有其他循环。
尝试使用调试器逐步执行代码,或尝试将以下内容添加为for循环中的第一行,并观察代码运行时变量会发生什么:
console.log('n:' + n + '; i: '+i);