我遇到了一个关于freecodecamp的练习,需要编写一个代码来返回给定整数的阶乘,并给出了这个例子: 例如:5! = 1 * 2 * 3 * 4 * 5 = 120f。
我得到了数学的工作原理,但我无法真正地围绕如何编码,直到我在这里发现了一些东西,n stackoverflow,但没有探究它为什么起作用,这类似于:
function factorialize(num) {
if(num === 0) {
return 1;
} else {
return num * factorialize(num - 1);
}
}
factorialize(5);
我真的不明白这是如何迭代所有小于或等于num的整数。任何人都可以帮我解释一下吗?
答案 0 :(得分:2)
它是一个递归函数。
使用5调用factorialize会执行以下操作:
5等于0吗?不,那么:
return num * factorialize(num - 1);
将5代入num意味着它实际上正在返回:
5 * factorialize(5-1)
所以我们可以将其简化为
5 * (factorialize(4))
然后必须在语句的后半部分将factorialize调用计算机返回值。
所以你可以想象,使用num = 4再次调用factorialize。因为num不等于零,所以它也返回相同的num * factorialize(num-1)
。原声明现在是:
5 * (4 * factorialize(3))
所以它必须再次召唤自己......再次......直到我们
5 * 4 * 3 * 2 * 1 * factorialize(0)
然后实际返回一个数字 - 这被称为基本情况,因此它不会无限地递归自身。它返回1.
导致
5 * 4 * 3 * 2 * 1 * 1
我认为基本情况应该是if(num == 1)。无论哪种方式都有效
基于评论编辑:0有意义,它显然现在涵盖了0阶乘。谢谢!对于num == 1的基本情况,它仅适用于参数num>的factorialize。 0
答案 1 :(得分:0)
它被称为递归。基本思想是一个函数调用自身,但传递一个越来越接近基数的值可以结束这个过程。请参阅此处:https://en.wikipedia.org/wiki/Recursion_(computer_science)和此处:Understanding recursion了解详情。
答案 2 :(得分:0)
它使用了一种称为递归的东西。简而言之,递归是函数调用自身时发生的事情。因此在示例中,num每次传递给factorialize时都会递减,而num会乘以传递给factorialize的次数。尝试在else块中添加一个print语句,以查看每次调用时该号码是否递减
答案 3 :(得分:0)
这是所谓的递归函数的基本实现。
https://en.wikipedia.org/wiki/Recursion_(computer_science)
递归通过基本上具有函数调用本身来工作。 所以我们将num *(num-1)一直乘以0(返回1)。