【问题标题】:Javascript Permutations magic trickJavascript排列魔术
【发布时间】:2017-02-06 15:18:28
【问题描述】:

我正在阅读一些算法来尝试理解 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) 或 console.log(ch) 之前或之后,它会在任何地方返回 undefined。 如果我删除 i 和 ch,算法将不再起作用。

谁能解释一下这条线以及它是如何工作的? 非常感谢

【问题讨论】:

  • 让你感到困惑的那一行有一个名字:“Javascript 多重左手赋值”。您还对var x = 'blah';x = 'blah' 之间的细微差别感到困惑。有用的链接来解释这种差异:stackoverflow.com/a/1471738/445131 它与在 for 循环内创建和销毁的变量的范围有关,或者在每次迭代中持续存在。要看到这一点,请在循环的每次迭代中打印出 ch。在循环内部或外部定义 ch 具有重要意义。

标签: javascript permutation


【解决方案1】:

不涉及魔法

var i, ch, chars = input.split('');

声明变量ichchars并将input.split('')返回的内容分配给chars

基本上相当于

var i; // undefined
var ch; // undefined
var chars = input.split(''); // Array of string

这通常是为了使变量在循环迭代中可用(以访问以前的值)。

但是……

i 只是循环变量,可以声明为内联

for (var i = 0; i < chars.length; i++) {

ch 可以存在于循环中,因为它无论如何都会在第一条语句中重新分配

  for (var i = 0; i < chars.length; i++) {
      var ch = chars.splice(i, 1);

这确实使示例令人困惑(可以说它写得不好)

【讨论】:

  • 非常感谢您的回答,但是,当我删除这两个时,为什么算法不再起作用了?
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多