javascript - 这个函数如何不使用额外的参数

标签 javascript

这段 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/

相关文章:

javascript - 无法使用 Angular JS 获取纯文本格式的 JSON 数据

javascript - Underscore.js,测试整个数组是否在另一个数组中

javascript - 如何使用 node.js 获取 documentdb 集合中的最后一个文档

javascript - 为基于Vue店面的网上商店设置RSS Feed(Google购物)

javascript - 如何循环遍历mysql数据库中的消息并正确显示它们

javascript - 使用 jquery 将图像替换为文本

php - 如何在Opencart中动态添加JavaScript?

javascript - 通过javascript渲染

javascript - 我怎样才能让这个 If 语句返回 true?

Javascript 将 DateTime 转换为 "______ seconds/minutes/hours/months ago"