我是JavaScript的新手,我正试图从这本书中了解一个例子。当我进入这个例子时,我期望fac (4 )的值为12,这将是(4-1)* 4的结果。
然而,当我在intro.html上运行在线图书(页面底部)的代码时,我得到了24的值。我在这里错过了什么?
function fac(n) {
if (n == 0)
return 1;
else
return fac(n - 1) * n;
}
console.log(fac(4));
我试图通过Twitter和在线研究找到答案,但没有成功。我知道我忽略了一些东西,但似乎看不见。
发布于 2014-12-21 15:51:59
因为它是递归的。
function fac(n) {
if (n == 0)
return 1;
else
return fac(n - 1) * n;
}
console.log(fac(4));
所以让我们追踪它
fac(3) * 4;
fac(2) * 3 * 4;
fac(1) * 2 * 3 * 4;
fac(0) * 1 * 2 * 3 * 4;
1 * 1 * 2 * 3 * 4;
当然,也就是24。
发布于 2014-12-21 16:17:18
如果您注意到您的代码,在第5行,此函数正在调用自己,这称为递归,请在维基百科上阅读更多有关它的信息。
让我们回到您的代码,并运行它看看它是如何工作的。让我们给每一行一个数字,这样我们就可以引用它。
1.function fac(n) {
2. if (n == 0)
3. return 1;
4. else
5. return fac(n - 1) * n;
6.}
7.console.log(fac(4));
对于第一次调用,输入值为4,让我们称其为call A
。
对于值4,第1行的if
条件将返回false,因此它将转到第5行,该行再次调用
fac(3) * 4;
现在您的函数call A
在这里暂停,并生成一个值为3的call B
。call A
的结果还有待评估。
现在,对于值3,第2行中的if
条件将再次返回false
,第5行的代码将执行如上;即
fac(2) * 3;
call B
在这里暂停,将出现输入相同函数的输入2的call C
。
在call C
上,您的代码将在第2行针对if
条件返回false
,因此它将使用输入1生成call D
。
fac(1) * 2
对于call D
,第2行中的if
条件将返回true,您的函数将返回1,因此call D
的值为1。现在从下到上替换每个fac(n),并继续计算每个调用。
result of call D => 1
result of call C => fac(1) * 2 => 1 * 2 => 2
result of call B => fac(2) * 3 => 2 * 3 => 6
result of call A => fac(3) * 4 => 6 * 4 => 24
我希望您能够理解它是如何工作的,递归中的重要点是在第2行代码中的停止条件。
上面的结果也可以通过使用循环产生,但使用递归更有趣。
快乐编码:)
https://stackoverflow.com/questions/27595015
复制