使用三元运算符和递归连接字符串

Concatenation of a string using ternary operator and recursion

我试着理解这个。这是来自 John Resig 的高级 javascript 的示例。

function yell(n) {
    return n > 0 ? yell(n-1) + "a" : "hiy";
}
alert( yell(4) );

作为初学者,我会以某种方式使用临时变量来保存字符串并将其连接到最后一个单词(这里是 hiyaaaa)。

我不明白这个高级示例是如何工作的。串联发生在哪里以及如何发生?如果最后添加,为什么 "hiy" 在最后的 "a" 之前?

三元只是 if 语句的快捷方式:

function yell(n) {
    var temp;
    if (n > 0) {
        temp = yell(n-1) + "a";
    } else {
        temp = "hiy";
    }
    return temp;
}

发生多重连接是因为函数使用较小的 n 值递归调用自身。最后调用(当n == 0)returnshiy。当每个递归调用 returns 时,它会将 a 附加到结果,并将 returns 附加到前一个调用者。

这是递归。 临时变量是调用yell的return值。 yell 调用自身直到 n <= 0。理解这一点的最简单方法可能是直观地写出将对 yell.

进行的一系列调用
yell(4) == yell(3) + "a"
yell(3) == yell(2) + "a"
yell(2) == yell(1) + "a"
yell(1) == yell(0) + "a"
yell(0) == "hiy"

替换这些值,您将得到 yell(4) 的最终值。

Conditional Operator 只是用两种情况表达条件语句的一种简洁方式。通过将运算符的这种用法替换为扩展 if 语句形式,可能更容易概念化。

function yell(n) {
    if (n > 0) {
        return yell(n-1) + "a";
    }

    return "hiy";
}

让我们来看看这个...

这只是一个函数声明,到达它时没有任何反应(除了函数被解析到内存中):

function yell(n){
  return n > 0 ? yell(n-1) + "a" : "hiy";
}

现在,调用该函数并将数字 4 传递给它:

alert( yell(4) );

4 被接收为参数 n 的值,然后是这一行:

  return n > 0 ? yell(n-1) + "a" : "hiy";

...首先检查n是否大于0,也就是4,所以带上了三元表达式的true部分输出:

yell(n-1) + "a"

这会递归调用 yell 并将 3 (n - 1) 传递给函数。请注意,第一次调用 yell 还没有返回任何内容,因为流量控制已传递给第二次出现的 yell.

函数以3作为n再次运行并再次命中三元的true部分,导致数字减一然后yell又被召唤了。

这将一直持续到 yell 被递归调用 0 作为传递给它的值,此时调用三元表达式的 false 部分并且 hiy 被返回并且来自递归调用的 aaaa 被连接到它上面。

function yell(n){
  return n > 0 ? yell(n-1) + "a" : "hiy";
}
alert( yell(4) );

function yell(n){
  if      (n > 3) {return yell(n-1) + "4"}
  else if (n > 2) {return yell(n-1) + "3"}
  else if (n > 1) {return yell(n-1) + "2"}
  else if (n > 0) {return yell(n-1) + "1"}
  else {return "0"} 
}
alert( yell(4) );

为了查看每个连接步骤的顺序,我尝试了这个。 仍然令人困惑,但至少我明白了它是如何工作的。

谢谢大家的有用回答!