逐步简单的递归:为什么"return 1"返回 1 以外的内容?

  • 本文关键字:返回 return 简单 递归 javascript
  • 更新时间 :
  • 英文 :


在下面的简单递归函数中,其中是"累积的";值被存储,因为它继续一遍又一遍地通过递归函数。我对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-这就是函数返回的内容

回答您的问题。

其中的";累积的";值在不断通过递归函数时被存储?

它不会存储在任何地方,至少不会以你可能认为的方式存储。每次调用递归函数时,都会传递一个新的函数参数,该参数充当"递归";累积值";,但实际上,它是一个新的函数调用,有新的参数传递给它。在条件满足之前,你的函数将继续调用自己。

最新更新