gpt4 book ai didi

javascript - 阶乘递归调用中的逻辑

转载 作者:行者123 更新时间:2023-12-03 07:51:31 26 4
gpt4 key购买 nike

我正在努力研究递归,也许我太着迷了,但这里是:

在 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 * 阶乘的值 (5-1) 吗?我们怎么能用 5 乘以尚未确定的东西的值(value)呢?如果这只是 5 * (5-1) = 20,那么这是显而易见的,甚至阶乘(5) * (5-1) = 20 也是有意义的..

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

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

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

最佳答案

很好的问题 - 很高兴你直接投入递归!

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

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

阶乘(5-1) 返回4 *阶乘(4-1)。让我们将其替换为上面的内容。这给了我们5 * 4 *阶乘(4-1)。我们再次执行 factorial(4-1) 并将其替换为 5 * 4 * 3 * Factorial(3-1)

如果继续,我们会得到5 * 4 * 3 * 2 *阶乘(2-1),然后得到5 * 4 * 3 * 2 * 1 *阶乘(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 条件每次都会捕获。

关于javascript - 阶乘递归调用中的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34969630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com