我正在努力绕过递归,也许我太过于痴迷,但这里有:
在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”。为什么不发生这种情况?
道歉,如果这看起来很简单,我可能会把它变成一个比需要更大的交易。我只想学习:)。
答案 0 :(得分:1)
添加到winhowes的回答
我们怎样才能将5乘以尚未确定的值?
嗯,我们不会,直到我们知道factorial(5-1)
的价值。当factorial(5-1)
被调用时,我们实际上并没有进行乘法,直到我们得到了明确的答案。所以5停留在那里并等待函数调用的结果返回,但是4也等待factorial(4-1)
..等等一旦最后的调用(即factorial(1)
)返回一个明确的答案它乘以等待它的任何东西,然后又与之前的等待呼叫相乘。
所以你有一个自上而下的方法调用,当你有值时,就会出现自下而上的乘法运算。如该图所示:
答案 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
条件每次都会捕获。