了解Eloquent JS第三版中的一个示例

时间:2018-12-05 08:26:33

标签: javascript recursion

如果我输入return (n-1)*n为8-1 = 7 * 8 = 56

但是,如果我像书中的示例return factorial(n-1)*n所示,它将返回40320。

计算/算术如何工作?它返回一个函数,它自己返回-对吗?
但是我不知道这是如何工作的。如何获得数字40320?

const factorial = function(n) {
  if (n === 0) {
    return 1
  } else {
    return factorial(n - 1) * n
  }
}

console.log(factorial(8))

2 个答案:

答案 0 :(得分:2)

我们可以通过执行以下操作来计算任何自然数(n)的阶乘:

n! = n * n-1 * n-2 * n-3 * ... * 1

例如:

4! = 4 * 3 * 2 * 1 = 24

这可以简化为:

n! = n * (n-1)!

例如:

4! = 4 * (4-1)! = 4 * 3!

3! = 3 * (3-1)! = 3 * 2!

2! = 2 * (2-1)! = 2 * 1!

1! = 1 * (1-1)! = 1 * 0!

0! = 1

因此,我们现在可以备份方程式了:

0! = 1

1! = 1 * 0! = 1 * (1) = 1 // <--- subbing in as we now know the result of 0! to be 1

2! = 2 * 1! = 2  * (1) = 2

3! = 3 * 2! = 3 * (2) = 6

4! = 4 * 3! = 4 * (6) = 24

使用代码执行此操作时,可以使用递归。这意味着我们在自身内部调用一个函数。以上述示例为例,我们可以使用名为fact()的函数来代替使用!表示法:

fact(4) = 4 * fact(4-1) = 4 * fact(3) // same as: 4! = 4 * (4-1)! = 4 * 3!

因此,在运行fact(4)之后,我们看到我们正在返回/尝试计算4 * fact(3)的结果。但是我们还不知道fact(3)是什么,所以我们需要计算它:

fact(3) = 3 * fact(3-1) = 3 * fact(2)

在这里,我们正在尝试计算3 * fact(2),但是我们还不知道fact(2)是什么,因此我们需要进行计算:

fact(2) = 2 * fact(2-1) = 2 * fact(1)

同样,我们需要确定fact(1)是什么:

fact(1) = 1 * fact(1-1) = 1 * fact(0)

最后,我们需要弄清楚fact(0)是什么:

fact(0) = 1

在这里,我们得到fact(0)等于1。请注意fact(0)如何返回一个没有引用另一个fact调用的值。这意味着我们已经达到了基本情况(在您的if(n===0)中定义),现在可以计算/遍历我们不知道如何回答的先前方程式。 因此,回到fact(1),我们现在将对fact(0)的调用替换为1

fact(1) = 1 * fact(0) 1 = 1

现在我们知道fact(1)是什么了,我们现在可以计算fact(2)

fact(2) = 2 * fact(1) 1 = 2

现在我们知道fact(2)是什么,我们可以计算fact(3)

fact(3) = 3 * fact(2) 2 = 6

最后,我们可以计算fact(4)

fact(4) = 4 * fact(3) 6 = 24

因此,使用它,我们得到fact(4) = 24

这是此递归函数如何工作的基础。

因此,如果您在函数末尾使用return (n-1)*n而不是return fact(n-1) * n,则只是在做一次返回,而不会再次调用函数来计算n-1的阶乘。

答案 1 :(得分:0)

它返回factorial(n-1)*n而不是(n-1)*n,因此计算将不只是8 * 7 =56。相反,由于它正在向自身返回调用,因此最终的计算将是8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320。

这称为recursive function。当您调用factorial(8)时,它将返回factorial(7)*8,在返回之前调用了factorial(7)factorial(7)返回factorial(6)*7,在返回之前调用了factorial(6)。这一直持续到factorial(2)返回factorial(1)*1,然后调用factorial(1)返回1

然后factorial(2)返回factorial(1)*2 = 1 * 2 = 2,factorial(3)返回factorial(2)*3 = 2 * 3 = 6,factorial(4)返回{{1} } = 6 * 24 = 24,依此类推。最后,factorial(3)*4返回factorial(8) = 5040 * 8 = 40320