阶乘...我不知道为什么这段代码有效
factorials... I have no idea why this code works
我在 freecodecamp 上遇到了一个练习,它需要编写一个代码来 return 给定整数的阶乘,并给出了这个例子:
例如:5! = 1 * 2 * 3 * 4 * 5 = 120f。
我知道数学是如何工作的,但我无法真正理解如何编写它,直到我在这里找到一些东西,n Whosebug,但没有解释它为什么工作,类似于这样:
function factorialize(num) {
if(num === 0) {
return 1;
} else {
return num * factorialize(num - 1);
}
}
factorialize(5);
我真的不明白这是如何遍历所有小于或等于 num 的整数。谁能帮我解释一下?
这叫做递归。基本思想是一个函数调用自身,但传入一个越来越接近 base can 的值,从而结束该过程。请参阅此处:https://en.wikipedia.org/wiki/Recursion_(computer_science) and here: Understanding recursion 了解更多信息。
它使用了一种叫做递归的东西。简而言之,递归是函数调用自身时发生的事情。所以在这个例子中,每次将 num 传递给 factorialize 时,num 都会递减,而 num 会乘以传递给 factorialize 的数字。尝试在 else 块中添加打印语句,以查看每次调用时数字都在递减
这是递归函数的基本实现。
https://en.wikipedia.org/wiki/Recursion_(computer_science)
递归基本上是通过函数调用自身来工作的。
所以我们将 num * (num-1) 一直乘以 0(returns 1)。
这是一个递归函数。
用 5 调用 factorialize 执行以下操作:
5等于0吗?不,那么:
return num * factorialize(num - 1);
用 5 代替 num 意味着它实际上是 returning:
5 * factorialize(5-1)
所以我们可以将其简化为
5 * (factorialize(4))
然后必须在语句的后半部分调用 factorialize 来计算 return 值。
所以你可以想象,当 num = 4 时再次调用 factorialize。由于 num 不等于 0,它也 return 相同 num * factorialize(num-1)
。原来的说法现在是:
5 * (4 * factorialize(3))
所以它必须一次又一次地调用自己...直到我们有
5 * 4 * 3 * 2 * 1 * factorialize(0)
然后实际上 return 是一个数字 - 这称为基本情况,因此它不会无限递归自身。它 returns 1.
导致
5 * 4 * 3 * 2 * 1 * 1
我认为基本情况应该是 if (num == 1)。无论哪种方式都有效
根据评论进行编辑:0 是有道理的,它显然现在涵盖了 0 个阶乘。谢谢!对于 num == 1 的基本情况,它仅适用于参数 num > 0.
的阶乘
我在 freecodecamp 上遇到了一个练习,它需要编写一个代码来 return 给定整数的阶乘,并给出了这个例子: 例如:5! = 1 * 2 * 3 * 4 * 5 = 120f。
我知道数学是如何工作的,但我无法真正理解如何编写它,直到我在这里找到一些东西,n Whosebug,但没有解释它为什么工作,类似于这样:
function factorialize(num) {
if(num === 0) {
return 1;
} else {
return num * factorialize(num - 1);
}
}
factorialize(5);
我真的不明白这是如何遍历所有小于或等于 num 的整数。谁能帮我解释一下?
这叫做递归。基本思想是一个函数调用自身,但传入一个越来越接近 base can 的值,从而结束该过程。请参阅此处:https://en.wikipedia.org/wiki/Recursion_(computer_science) and here: Understanding recursion 了解更多信息。
它使用了一种叫做递归的东西。简而言之,递归是函数调用自身时发生的事情。所以在这个例子中,每次将 num 传递给 factorialize 时,num 都会递减,而 num 会乘以传递给 factorialize 的数字。尝试在 else 块中添加打印语句,以查看每次调用时数字都在递减
这是递归函数的基本实现。
https://en.wikipedia.org/wiki/Recursion_(computer_science)
递归基本上是通过函数调用自身来工作的。 所以我们将 num * (num-1) 一直乘以 0(returns 1)。
这是一个递归函数。
用 5 调用 factorialize 执行以下操作:
5等于0吗?不,那么:
return num * factorialize(num - 1);
用 5 代替 num 意味着它实际上是 returning:
5 * factorialize(5-1)
所以我们可以将其简化为
5 * (factorialize(4))
然后必须在语句的后半部分调用 factorialize 来计算 return 值。
所以你可以想象,当 num = 4 时再次调用 factorialize。由于 num 不等于 0,它也 return 相同 num * factorialize(num-1)
。原来的说法现在是:
5 * (4 * factorialize(3))
所以它必须一次又一次地调用自己...直到我们有
5 * 4 * 3 * 2 * 1 * factorialize(0)
然后实际上 return 是一个数字 - 这称为基本情况,因此它不会无限递归自身。它 returns 1.
导致
5 * 4 * 3 * 2 * 1 * 1
我认为基本情况应该是 if (num == 1)。无论哪种方式都有效
根据评论进行编辑:0 是有道理的,它显然现在涵盖了 0 个阶乘。谢谢!对于 num == 1 的基本情况,它仅适用于参数 num > 0.
的阶乘