我试着理解这个。这是来自John Resig的高级JavaScript的一个例子。
function yell(n) {
return n > 0 ? yell(n-1) + "a" : "hiy";
}
alert( yell(4) );
作为初学者,我会以某种方式使用临时变量来保存字符串并将其连接到最后一个单词(这里是hiyaaaa)。
我无法理解这个高级示例是如何工作的。连接发生的地方和方式如何?如果最后添加的话,为什么在“a”之前的“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) );
这是递归。临时变量是对yell
的调用的返回值。 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";
}
三元组只是if
语句的捷径:
function yell(n) {
var temp;
if (n > 0) {
temp = yell(n-1) + "a";
} else {
temp = "hiy";
}
return temp;
}
正在发生多个串联,因为函数以较小的n
值递归调用自身。最后一次调用(当n == 0
时)返回hiy
。当每个递归调用返回时,它会将a
附加到结果并将其返回给前一个调用者。
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) );
为了查看每个连接步骤的顺序,我尝试了这个。仍然令人困惑,但至少我看到它是如何工作的。
谢谢大家的有用答案!