你能解释一下这个Factorial函数是如何工作的吗?

sjm*_*tin 1 javascript

我理解"一个"解决方案是:

function Factorial(number)
{
    if(number == 0 || number == 1){
        return 1;
    }

    return number * Factorial(number -1);

}
Run Code Online (Sandbox Code Playgroud)

我想了解到底发生了什么.当数字== 1时,我理解最后一部分的内容.

如果我们采取一个简单的例子说3!

  1. 3不等于0或1所以我们返回3*Factorial(2)
  2. 2不等于0或1所以我们返回2*Factorial(1)
  3. 1等于1所以我们返回1

我们怎么知道何时停止?事实是我们返回1告诉函数停止吗?

如果是这种情况,为什么当我们第一次返回3*Factorial(2)时函数不会停止?是因为它返回一个函数,所以它必须继续,直到它不再返回一个函数?

谢谢

Rah*_*thi 5

我认为你必须理解阶乘的逻辑.

因此,因子只是产品,用感叹号表示,即如果你写的话

 0! = 1
 1! = 1
 2! = 2*1
 3! = 3*2*1
 4! = 4*3*2*1
 5! = 5*4*3*2*1
Run Code Online (Sandbox Code Playgroud)

希望您找到该模式,因此您可以将上述因子写为:

 0! = 1
 1! = 1
 2! = 2*1!
 3! = 3*2!
 4! = 4*3!
 5! = 5*4!
Run Code Online (Sandbox Code Playgroud)

所以在你的函数中你使用的是类似的逻辑.

现在在你的功能

if(number == 0 || number == 1)
{
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

上面的逻辑是覆盖前两种情况,即0!1!

return number * Factorial(number -1);
Run Code Online (Sandbox Code Playgroud)

是剩下的数字.

所以你正在使用解决阶乘问题的递归技术.

要理解递归,让我们取一个数字说5即,我们要找到5的值!

然后首先你的功能将检查

if(number == 0 || number == 1)
Run Code Online (Sandbox Code Playgroud)

不满意,然后它移动到下一行,即,

return number * Factorial(number -1); 
Run Code Online (Sandbox Code Playgroud)

这使

5*Factorial(5-1) which is equal to 5*Factorial(4)
Run Code Online (Sandbox Code Playgroud)

现在,在对Factorial函数的后续调用中,它将返回如下值:

5*(4*Factorial(4-1)) which is equal to 5*(4*Factorial(3))
5*(4*(3*Factorial(3-1)) which is equal to 5*(4*(3*Factorial(2)))
5*(4*(3*(2*Factorial(2-1)))) which is equal to 5*(4*(3*(2*Factorial(1))))
Run Code Online (Sandbox Code Playgroud)

现在当它返回factorial(1)然后你的条件

if(number == 0 || number == 1)
Run Code Online (Sandbox Code Playgroud)

很满意,因此你得到的结果如下:

5*4*3*2*1 = 120
Run Code Online (Sandbox Code Playgroud)

在旁注:

请注意,factrial仅用于正整数.