我正在阅读关于'功能'的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语句之外的逻辑。有人可以拼写出来。我已经运行了代码,并按照指定的方式工作。
答案 0 :(得分:3)
例如,让我们计算factorial(4)
:
n = 4
n != 0
和n != 1
起,factorial(4)
的值为4 * factorial(3)
factorial(3)
n = 3
n != 0
和n != 1
起,factorial(3)
的值为3 * factorial(2)
factorial(2)
n = 2
n != 0
和n != 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在回答我时所指出的那样(并且在他们自己的回答中),这一点也(但主要是)确保递归停止,否则它将继续为负无穷大(或者更确切地说,系统崩溃)。