如果我输入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))
答案 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