这段 JavaScript 来自 Resig 在他的 JavaScript Ninja 中的代码书:
function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
assert( yell(4) == "hiyaaaa", "Calling the function by itself comes naturally." );
所以这是一些简单的递归。我理解递归。这可能是一个愚蠢的问题。但是,我不明白为什么这在这么少的代码行中起作用。 "aaaa"
在哪里附加到 "hiy"
?如果我在 Prolog 中这样做,我想我会向 yell
添加一个额外的参数来跟踪正在构建的字符串。
最佳答案
此函数通过将 “a”
附加到每一步 next 调用的返回值来构建字符串。这可能有助于可视化调用堆栈:
yell(4) = yell(3) + "a"
yell(3) = yell(2) + "a"
yell(2) = yell(1) + "a"
yell(1) = yell(0) + "a"
yell(0) = "hiy"
我们现在拥有了解其工作原理所需的所有信息。我们只需要“展开”堆栈并将其重新插入:
yell(1) = "hiy" + "a"
yell(2) = "hiy" + "a" + "a"
yell(3) = "hiy" + "a" + "a" + "a"
yell(4) = "hiy" + "a" + "a" + "a" + "a"
所以最后的结果是:
"hiyaaaa"
您不需要额外参数的原因是递归的任何阶段都不需要访问上一个步骤的值。相反,每个值都返回其值和进程中的下一个值的组合。
关于javascript - 这个函数如何不使用额外的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21466793/