在下面的简单递归函数中,其中是"累积的";值被存储,因为它继续一遍又一遍地通过递归函数。我对return 1
如何返回阶乘值而不仅仅是1
感到困惑。
function factorial(x)
{
if (x === 0){
return 1;
}
return x * factorial(x-1);
}
如果你不懂阶乘,我邀请你阅读维基百科上关于这个主题的文章https://en.wikipedia.org/wiki/Factorial.
阶乘是这样计算的:ex:10!=10×9×8×7×6×5×4×3×2×1×0!
换句话说10!=10×9,因此返回x*阶乘(x-1(
当你到达终点时,你必须有一个值(否则你会有一个无限循环(。
你必须有一个阶乘0=>0!=1.
让我们逐帧分解,当你执行factorial(5)
时,你会得到-
factorial(5) =
5 * factorial(5 - 1) =
4 * factorial(4 - 1) =
3 * factorial(3 - 1) =
2 * factorial(2 - 1) =
1 * factorial(1 - 1) =
1
请注意,最后一步仅为1,因为factorial(1 - 1)
为1(x
为0时为return 1;
(
从下到上一步一步积累所有这些,你就会得到-
factorial(5) =
5 * 4 * 3 * 2 * 1 * 1
^
4 * 3 * 2 * 1 * 1
^
3 * 2 * 1 * 1
^
2 * 1 * 1
^
1 * 1
^ 1
为了在代码-中说明这一点
factorial(5)
返回5 * factorial(4)
要实际返回
5 * factorial(4)
,我们需要评估factorial(4)
-factorial(4)
返回4 * factorial(3)
所以
5 * factorial(4)
变成5 * 4 * factorial(3)
现在我们必须评估
factorial(3)
才能返回5 * 4 * factorial(3)
-factorial(3)
是3 * factorial(2)
因此
5 * 4 * factorial(3)
变为5 * 4 * 3 * factorial(2)
现在对于
factorial(2)
,即2 * factorial(1)
因此
5 * 4 * 3 * factorial(2)
变为5 * 4 * 3 * 2 * factorial(1)
factorial(1)
变为1 * factorial(0)
因此
5 * 4 * 3 * 2 * factorial(1)
变为5 * 4 * 3 * 2 * 1 * factorial(0)
最后
factorial(0)
返回1个因此
5 * 4 * 3 * 2 * 1 * factorial(0)
变为5 * 4 * 3 * 2 * 1 * 1
因此factorial(5)
-5 * factorial(4)
的实际返回扩展为5 * 4 * 3 * 2 * 1 * 1
-这就是函数返回的内容
回答您的问题。
其中的";累积的";值在不断通过递归函数时被存储?
它不会存储在任何地方,至少不会以你可能认为的方式存储。每次调用递归函数时,都会传递一个新的函数参数,该参数充当"递归";累积值";,但实际上,它是一个新的函数调用,有新的参数传递给它。在条件满足之前,你的函数将继续调用自己。