【问题标题】:Logic in factorial recursion call阶乘递归调用中的逻辑
【发布时间】:2016-01-23 22:22:00
【问题描述】:

我正在努力解决递归问题,也许我太着迷了,但这里是:

在javascript代码中

var factorial = function(number) {
  // If the number is negative, it doesn't have a factorial. Return an
  // impossible value to indicate this.
  if (number < 0) {
    return -1;
  }

  // If the number is zero, its factorial is one.
  if (number === 0) {
    return 1;
  }

  // If the number is neither illegal nor zero, call factorial again,
  // this time passing in a smaller number. Eventually we'll reach 0,
  // causing each call to return to its caller and the recursion terminates.

  return number * factorial(number - 1);
};

factorial(5);

递归函数按预期返回120,但为什么呢?

在绘制逻辑时,有两件事让我很头疼:1)为什么这甚至可以操作,2)虽然可以操作,但为什么不返回 -1?

1) 为什么这还能操作?:

在绘制这个并将 5 作为参数插入时,在底部的 return 语句中,我们得到 return 5 * factorial(5 - 1)。为什么这等于预期的 20?我们不是调用函数返回 5 * factorial(5-1) 的值吗?我们如何将 5 乘以尚未确定的值?如果这只是 5 * (5-1) = 20,那么这很明显,甚至阶乘 (5) * (5-1) = 20 也有意义..

2)虽然可以操作,但为什么不返回-1?:

与上面的情况一样,最终,我们将在递归中达到 1 * factorial(1-1)... 1 * (1-1) = 0 的点。这个函数将数字插入自身进行操作,并且我们的基本情况是“如果插入的整数为零,则停止操作并返回 -1”。为什么这里没有发生这种情况?

抱歉,如果这看起来很简单,我可能会做得比需要的更大。我只是想学习:)。

【问题讨论】:

    标签: javascript wordpress recursion factorial


    【解决方案1】:

    很好的问题 - 很高兴您正在深入研究递归!

    让我们来看看发生了什么:

    我们从factorial(5) 开始。正如您所指出的,这将返回 5 * factorial(5-1)。为了理解factorial(5-1)是什么,我们必须再次调用factorial函数。

    factorial(5-1) 返回4 * factorial(4-1)。让我们将其替换为上面的内容。这给了我们5 * 4 * factorial(4-1)。我们再次使用factorial(4-1) 并替换它。这给了我们5 * 4 * 3 * factorial(3-1)

    如果我们继续,我们会得到5 * 4 * 3 * 2 * factorial(2-1),然后是5 * 4 * 3 * 2 * 1 * factorial(1-1)

    现在这里发生了一些不同的事情。 factorial(1-1) 根据 if 条件返回 1

    // If the number is zero, its factorial is one.
    if (number === 0) {
        return 1;
    }
    

    所以我们有5 * 4 * 3 * 2 * 1 * 1 = 120 = 5!正如我们所料。除非我们输入一个负数,否则我们永远不会达到number == -1 if 条件。对于任何正数,number == 0 条件每次都会捕获。

    【讨论】:

    • 啊哈!哇,非常感谢winhowes的清晰解释。非常感谢你!
    • @jb07 如果这是正确答案 - 您介意将其标记为正确答案吗?谢谢!
    • 知道了。希望我做对了(我仍然没有'rep'来投票:))
    【解决方案2】:

    添加到winhowes的答案

    我们如何将 5 乘以尚未确定的值?

    好吧,我们不知道,直到我们知道factorial(5-1) 的值。当factorial(5-1) 被调用时,我们实际上还没有进行乘法运算,直到我们对此有明确的答案。所以 5 停留在那里并等待函数调用的结果返回,但随后 4 也等待factorial(4-1).. 等。一旦最终调用(即factorial(1))返回明确的答案,它乘以无论在等待什么,然后它会与之前的等待呼叫相乘。

    所以你有一个自上而下的方法调用,当你有值时,就会发生自下而上的乘法。如图所示:

    【讨论】:

    • 感谢您的说明!查看操作发生的顺序对我很有用。有什么关于书籍/资源的建议可以像你上面那样填补这些空白吗?
    • 您将能够找到大量解释递归和一般编程的其他“基本”部分的书籍,但不幸的是,我无法真正具体指出任何内容。我刚在大学学过这些,但在这种情况下,谷歌搜索确实是你最好的选择。当你开始编程时,递归绝对是令人困惑的部分之一,但你做得最好,不仅仅是让它完成这项工作,而是真正尝试理解真正发生的事情。这会给你带来很多好处 :) 所以请坚持下去。
    • 另外,如果您认为我的回答在某些方面对您有所帮助,请随时点赞 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2015-04-19
    • 2019-07-24
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多