【问题标题】:Why does this function example from Eloquent JavaScript return the value 24?为什么 Eloquent JavaScript 中的这个函数示例返回值 24?
【发布时间】:2014-12-21 23:50:09
【问题描述】:

我是 JavaScript 新手,正在尝试理解书中的一个示例。当我逐步执行此示例时,我希望 fac(4) 的值为 12。这将是 (4 - 1) * 4 的结果。

但是,当我从http://eloquentjavascript.net/00_intro.html 的在线书籍(靠近页面底部)运行代码时,我得到的值是 24。我在这里缺少什么?

function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}
console.log(fac(4));

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

【问题讨论】:

  • 玩电脑——跟踪每一步的执行情况。
  • 这是递归函数的“Hello World”。 ;-) 在没有递归的情况下计算阶乘实际上更简单,也更快,但是你去吧。
  • 在学校里从来没有报道过这个(获得了社会工作学位),但我只花了大约一个小时就知道了。下面的两个答案都非常有帮助。

标签: javascript function recursion


【解决方案1】:

因为它是递归的。

function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}
console.log(fac(4));

让我们追踪它

fac(3) * 4;
fac(2) * 3 * 4;
fac(1) * 2 * 3 * 4;
fac(0) * 1 * 2 * 3 * 4;
1 * 1 * 2 * 3 * 4;

当然,也就是 24 岁。

【讨论】:

    【解决方案2】:

    如果您注意到您的代码,在第 5 行,此函数正在调用自身,这称为递归,请在 wikipedia 上阅读更多相关信息

    让我们回到您的代码并试运行它,看看它是如何工作的。让我们给每一行一个数字,以便我们参考它

    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 if 第 1 行的条件将返回 false,因此它将转到第 5 行,该行再次调用

    fac(3) * 4;
    

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

    现在值为 3,第 2 行的 if 条件将再次返回 false,第 5 行的代码将像上面一样执行;即

    fac(2) * 3;
    

    call B 在这里暂停,将有 call C 与输入 2 相同的功能。

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

    fac(1) * 2
    

    对于call Dif,第 2 行的条件将返回 true,您的函数将返回 1,因此 call D 的评估值为 1。现在从下到上替换每个 fac(n) 并继续评估每次通话。

    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 行编写的停止条件。

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

    快乐编码:)

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2022-12-18
      相关资源
      最近更新 更多