javascript递归函数 - 不了解发生了什么

时间:2014-09-22 22:36:59

标签: javascript recursion

我正在阅读关于'功能'的javascript文档。并且遇到了这段代码,我没有按照它如何一步一步地工作,特别是内部递归函数。

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

var a, b, c, d, e;
a = factorial(1); // a gets the value 1
b = factorial(2); // b gets the value 2
c = factorial(3); // c gets the value 6
d = factorial(4); // d gets the value 24
e = factorial(5); // e gets the value 120

我没有遵循第一个if语句之外的逻辑。有人可以拼写出来。我已经运行了代码,并按照指定的方式工作。

2 个答案:

答案 0 :(得分:3)

例如,让我们计算factorial(4)

  • n = 4
  • n != 0n != 1起,factorial(4)的值为4 * factorial(3)
  • 让我们计算factorial(3)
    • n = 3
    • n != 0n != 1起,factorial(3)的值为3 * factorial(2)
    • 让我们计算factorial(2)
      • n = 2
      • n != 0n != 1起,factorial(2)的值为2 * factorial(1)
      • 让我们计算factorial(1)
        • n = 1
        • n == 1起,factorial(1)的值为1
      • 因此,factorial(2)的值为2 * 1 == 2
    • 因此,factorial(3)的值为3 * 2 == 6
  • 因此,factorial(4)的值为4 * 6 == 24

答案 1 :(得分:0)

如果传递的参数为0或1,则返回1。

如果传递的参数是2,那么参数(2)乘以传递1的相同函数的递归,因为如果传递1,1,则返回1,如上所述。

如果传递的参数是3,那么它变为3 * 2 * 1,后两个通过递归解析。

对于4,它变为4 * 3 * 2 * 1,后3通过递归解析。

因此,如果你想知道100 * 99 * 98 ..... * 3 * 2 * 1等于什么,这个功能可以提供答案。

当然,if语句的要点是确保factorial(1 - 1)永远不会发生,因为如果它发生了,最后一步将是* 0,结果总是为0。

正如@Oriol在回答我时所指出的那样(并且在他们自己的回答中),这一点也(但主要是)确保递归停止,否则它将继续为负无穷大(或者更确切地说,系统崩溃)。