【问题标题】:Can you explain how this Factorial function works?你能解释一下这个阶乘函数是如何工作的吗?
【发布时间】:2015-04-09 17:18:30
【问题描述】:

我了解“a”解决方案是:

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

    return number * Factorial(number -1);

}

我想了解到底发生了什么。当 number == 1 时,我了解一直到最后部分的情况。

如果我们举一个简单的例子,比如 3!

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

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

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

谢谢

【问题讨论】:

  • “是不是因为它正在返回一个函数,所以它必须继续直到它不再返回一个函数?”
  • 请注意,如果不使用正整数调用此函数,则会创建一个无限循环。
  • 最后 发生的事情是 3 乘以从 Factorial(2) 返回的值。这就是最终的返回值。在Factorial(2) 完成之前,该步骤无法进行,而Factorial(2)Factorial(1) 完成之前无法完成。

标签: javascript


【解决方案1】:

我认为你必须了解阶乘的逻辑。

所以阶乘只是产品,用感叹号表示,即,如果你写

 0! = 1
 1! = 1
 2! = 2*1
 3! = 3*2*1
 4! = 4*3*2*1
 5! = 5*4*3*2*1

希望你能找到规律,所以你可以把上面的阶乘写成:

 0! = 1
 1! = 1
 2! = 2*1!
 3! = 3*2!
 4! = 4*3!
 5! = 5*4!

所以在你的函数中你使用了类似的逻辑。

现在在你的函数中

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

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

return number * Factorial(number -1);

是其余的数字。

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

为了理解递归,让我们假设一个数字 5,即我们想要找到 5 的值!。

那么首先你的函数会检查

if(number == 0 || number == 1)

不满足,则移至下一行,即,

return number * Factorial(number -1); 

给了

5*Factorial(5-1) which is equal to 5*Factorial(4)

现在在后续调用 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))))

现在当它返回阶乘(1)时,你的条件

if(number == 0 || number == 1)

很满意,因此您会得到如下结果:

5*4*3*2*1 = 120

附带说明:

请注意,阶乘仅用于正整数

【讨论】:

    【解决方案2】:

    递归依赖于所谓的基本情况:

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

    if 语句称为基本情况。基本情况定义了递归应该停止的时间。注意你是如何返回1而不是再次返回调用函数的结果,例如Factorial(number -1)

    如果您的基本情况的条件不满足(即如果 number 不是 1 或 0),那么您继续使用 number * Factorial(number - 1) 再次调用该函数

    【讨论】:

      【解决方案3】:

      如果是这样,为什么我们第一次返回 3 * Factorial(2) 时函数没有停止?

      您的简单示例 3!可以这样阐述:

      return 3 * Factorial(2) 
      

      将被替换为

      return 3 * (2 * Factorial(1))
      

      然后将被替换为

      return 3 * (2 * 1) // = 6 Hence 6 is returned at last and recursion ends.
      

      我们如何知道何时停止?

      当你所有的 Factorial(value) 被一个返回值替换时,我们停止。

      是我们返回 1 的事实告诉函数停止吗?

      在某种程度上,是的。因为它是最后一个返回值。

      【讨论】:

      • 了解所获得内容的最佳答案
      【解决方案4】:

      这叫做递归。

      这个函数是这样调用的

      var 结果 = 阶乘(3); 在阶乘函数中

      第一次 返回 3*Factorial(2);

      现在这里的 return 语句没有被执行 insted Factorial 被再次调用.. 所以第二次 返回 2*Factorial(1);

      再次在阶乘(1) 第三次 返回 1;

      所以转到第二个 返回 2*1;

      紧挨着第一个 返回 3*(2*1);

      终于 var 结果 = 3*2*1 = 6.

      【讨论】:

        【解决方案5】:

        函数是递归的(调用自己)——每次都从“数字”中取一个。

        最终(只要它是一个正整数调用它,否则你可能会得到一个无限循环)你总是会遇到条件 (number == 1) 所以它不会进一步递归,而是返回1 而不是再次调用该函数。

        然后,一旦你到达底部 (1),它就会开始运行函数并沿着函数调用堆栈以另一种方式工作,每次都使用之前的结果:

        1 = 1 
        (2*1) = 2
        (3*2) = 6
        (4*6) = 24
        

        所以函数的最终 return 语句将返回所需的结果

        【讨论】:

          猜你喜欢
          • 2011-02-16
          • 2013-03-13
          • 1970-01-01
          • 2017-03-19
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 2020-08-18
          • 1970-01-01
          相关资源
          最近更新 更多