【发布时间】:2017-07-06 06:51:56
【问题描述】:
我试图编写一个递归阶乘函数来练习我的递归并想出了这个:
function test(num){
return (num * test(num - 1))
}
但是,每当我运行它时,它都会永远循环,并且出现 Range Error: Maximum call stack size exceeded。
但是如果我写它来处理异常,
function factorial(num) {
if (num < 0) {
return -1;
} else if (num === 0) {
return 1;
} else {
return (num * factorial(num - 1));
}
}
完美运行。
2 个问题。
为什么第一个不起作用?
第二个如何知道何时停止运行。如果 num 实际上每次都将其值更改为 -1,最终将达到 0,它应该触发 else if 并返回 1,但如果您运行 factorial(3),它确实返回 6。
【问题讨论】:
-
第一个总是自称(
test())——它没有条件停止。第二个将在num === 0时停止。 -
第二个有一个
if()语句,当它到达基本情况时不会递归。这就是递归的本质。 -
第二个有效,因为即使它返回 1,该结果也会在调用它的函数中乘以
num(其中 num = 1),然后乘以 2,以此类推调用堆栈
标签: javascript algorithm recursion