factorials ...我不知道为什么这段代码有效

时间:2015-07-19 02:13:19

标签: javascript recursion factorial

我遇到了一个关于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的整数。任何人都可以帮我解释一下吗?

4 个答案:

答案 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)。