Javascript 阶乘。。。我不知道为什么这个代码会起作用

Javascript 阶乘。。。我不知道为什么这个代码会起作用,javascript,recursion,factorial,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(n

我在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的整数的。有人能帮我解释一下吗?

这叫做递归。其基本思想是一个函数调用自身,但传入一个值,该值越来越接近基can,从而结束该过程。请参见此处:和此处:了解更多信息。

它使用了一种称为递归的方法。简单地说,递归就是函数调用自身时发生的事情。因此,在本例中,num每次传递给factorialize时都会递减,num会乘以传递给factorialize的数字。尝试在else块中添加一条print语句,以查看该数字随着每次调用而递减

这是递归函数的基本实现

递归基本上是通过函数调用本身来工作的。
所以我们将num*(num-1)一直乘以0(返回1)。

这是一个递归函数

使用5调用factorialize会执行以下操作:

5等于0吗?不,那么:

return num * factorialize(num - 1); 
用5代替num表示它实际返回:

5 * factorialize(5-1)
所以我们可以简化为

5 * (factorialize(4))
然后必须在语句的后半部分调用factorialize以计算返回值

可以想象,再次调用factorialize时num=4。由于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>0的因式分解。

这种情况是
num==0
,因为0!(零阶乘)等于1。