阶乘递归调用中的逻辑

时间:2016-01-23 22:22:01

标签: javascript wordpress recursion factorial

我正在努力绕过递归,也许我太过于痴迷,但这里有:

在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语句中,我们得到返回5 * factorial(5 - 1)。为什么这与预期的20相等?我们是不是要调用函数来返回5 * factorial (5-1)的值?我们怎样才能将5乘以尚未确定的东西的值?如果这只是5 *(5-1)= 20,那么显而易见甚至因子(5)*(5-1)= 20是有道理的..

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

与上面的情况一样,最终,我们将在递归中得到点,它看起来像1 *阶乘(1-1)...... 1 *(1-1)= 0。此函数将数字插入到自身进行操作,并且我们的基本情况说“如果插入的整数为零,则停止操作并返回-1”。为什么不发生这种情况?

道歉,如果这看起来很简单,我可能会把它变成一个比需要更大的交易。我只想学习:)。

2 个答案:

答案 0 :(得分:1)

添加到winhowes的回答

  

我们怎样才能将5乘以尚未确定的值?

嗯,我们不会,直到我们知道factorial(5-1)的价值。当factorial(5-1)被调用时,我们实际上并没有进行乘法,直到我们得到了明确的答案。所以5停留在那里并等待函数调用的结果返回,但是4也等待factorial(4-1) ..等等一旦最后的调用(即factorial(1))返回一个明确的答案它乘以等待它的任何东西,然后又与之前的等待呼叫相乘。

所以你有一个自上而下的方法调用,当你有值时,就会出现自下而上的乘法运算。如该图所示:

documentation

答案 1 :(得分:0)

很棒的问题 - 很高兴你正在深入了解递归!

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

我们从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条件每次都会捕获。