Javascript 排列魔术
Javascript Permutations magic trick
我正在阅读一些算法来尝试理解 javascript 中的排列,下面的算法让我大吃一惊
var permArr = [], usedChars = [];
function permute(input) {
var i, ch, chars = input.split('');
for (i = 0; i < chars.length; i++) {
ch = chars.splice(i, 1);
usedChars.push(ch);
if (chars.length == 0) permArr[permArr.length] = usedChars.join('');
permute(chars.join(""));
chars.splice(i, 0, ch);
usedChars.pop();
}
return permArr
}
仅供参考,我在以下网站上找到了这个算法:http://staff.roguecc.edu/JMiller/JavaScript/permute.html
我可以看到这个算法有效,但是有一行让我感到困惑,我找不到它有效的地方
var i, ch, chars = input.split("");
如果代码中的 i console.log(i) or console.log(ch) before OR after ,它 returns 处处未定义。
如果我删除 i 和 ch,该算法将不再有效。
谁能给我解释一下这条线以及它是如何工作的?
非常感谢
不涉及魔法
var i, ch, chars = input.split('');
声明变量 i
、ch
和 chars
并将 chars
赋值给 input.split('')
returns.
基本上相当于
var i; // undefined
var ch; // undefined
var chars = input.split(''); // Array of string
这通常是为了使变量在循环迭代中可用(以访问以前的值)。
然而...
i
只是循环变量,可以声明为 inline
for (var i = 0; i < chars.length; i++) {
ch
可以存在于循环中,因为无论如何它都会在第一条语句中重新分配
for (var i = 0; i < chars.length; i++) {
var ch = chars.splice(i, 1);
这确实让示例变得混乱(可以说它写得不好)
我正在阅读一些算法来尝试理解 javascript 中的排列,下面的算法让我大吃一惊
var permArr = [], usedChars = [];
function permute(input) {
var i, ch, chars = input.split('');
for (i = 0; i < chars.length; i++) {
ch = chars.splice(i, 1);
usedChars.push(ch);
if (chars.length == 0) permArr[permArr.length] = usedChars.join('');
permute(chars.join(""));
chars.splice(i, 0, ch);
usedChars.pop();
}
return permArr
}
仅供参考,我在以下网站上找到了这个算法:http://staff.roguecc.edu/JMiller/JavaScript/permute.html
我可以看到这个算法有效,但是有一行让我感到困惑,我找不到它有效的地方
var i, ch, chars = input.split("");
如果代码中的 i console.log(i) or console.log(ch) before OR after ,它 returns 处处未定义。 如果我删除 i 和 ch,该算法将不再有效。
谁能给我解释一下这条线以及它是如何工作的? 非常感谢
不涉及魔法
var i, ch, chars = input.split('');
声明变量 i
、ch
和 chars
并将 chars
赋值给 input.split('')
returns.
基本上相当于
var i; // undefined
var ch; // undefined
var chars = input.split(''); // Array of string
这通常是为了使变量在循环迭代中可用(以访问以前的值)。
然而...
i
只是循环变量,可以声明为 inline
for (var i = 0; i < chars.length; i++) {
ch
可以存在于循环中,因为无论如何它都会在第一条语句中重新分配
for (var i = 0; i < chars.length; i++) {
var ch = chars.splice(i, 1);
这确实让示例变得混乱(可以说它写得不好)