首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个函数示例从雄辩的JavaScript返回值24?

为什么这个函数示例从雄辩的JavaScript返回值24?
EN

Stack Overflow用户
提问于 2014-12-21 23:50:09
回答 2查看 467关注 0票数 1

我是JavaScript的新手,我正试图从这本书中了解一个例子。当我进入这个例子时,我期望fac (4 )的值为12,这将是(4-1)* 4的结果。

然而,当我在intro.html上运行在线图书(页面底部)的代码时,我得到了24的值。我在这里错过了什么?

代码语言:javascript
运行
复制
function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}
console.log(fac(4));

我试图通过Twitter和在线研究找到答案,但没有成功。我知道我忽略了一些东西,但似乎看不见。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-21 23:51:59

因为它是递归的。

代码语言:javascript
运行
复制
function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}
console.log(fac(4));

所以让我们追踪它

代码语言:javascript
运行
复制
fac(3) * 4;
fac(2) * 3 * 4;
fac(1) * 2 * 3 * 4;
fac(0) * 1 * 2 * 3 * 4;
1 * 1 * 2 * 3 * 4;

当然,也就是24。

票数 4
EN

Stack Overflow用户

发布于 2014-12-22 00:17:18

如果您注意到您的代码,在第5行,此函数正在调用自己,这称为递归,请在维基百科上阅读更多有关它的信息。

让我们回到您的代码,并运行它看看它是如何工作的。让我们给每一行一个数字,这样我们就可以引用它。

代码语言:javascript
运行
复制
1.function fac(n) {
2.  if (n == 0)
3.    return 1;
4.  else
5.    return fac(n - 1) * n;
6.}
7.console.log(fac(4));

对于第一次调用,输入值为4,让我们称其为call A

对于值4,第1行的if条件将返回false,因此它将转到第5行,该行再次调用

代码语言:javascript
运行
复制
fac(3) * 4;

现在您的函数call A在这里暂停,并生成一个值为3的call Bcall A的结果还有待评估。

现在,对于值3,第2行中的if条件将再次返回false,第5行的代码将执行如上;即

代码语言:javascript
运行
复制
fac(2) * 3;

call B在这里暂停,将出现输入相同函数的输入2的call C

call C上,您的代码将在第2行针对if条件返回false,因此它将使用输入1生成call D

代码语言:javascript
运行
复制
fac(1) * 2

对于call D,第2行中的if条件将返回true,您的函数将返回1,因此call D的值为1。现在从下到上替换每个fac(n),并继续计算每个调用。

代码语言:javascript
运行
复制
result of call D => 1  
result of call C => fac(1) * 2 => 1 * 2 => 2  
result of call B => fac(2) * 3 => 2 * 3 => 6  
result of call A => fac(3) * 4 => 6 * 4 => 24

我希望您能够理解它是如何工作的,递归中的重要点是在第2行代码中的停止条件。

上面的结果也可以通过使用循环产生,但使用递归更有趣。

快乐编码:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27595015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档