所以我很难理解递归,我不知道返回1作为最后一步,包装了下面的代码。为什么在最后一步分配" 1"返回值而不是" 27"?
我试着用自己写出伪代码来解释它,但尝试让我意识到我真的不知道发生了什么。如果除了解释之外,还提供了一些伪代码,那就太棒了。谢谢。
function solveExponent(num, exp) {
if (exp === 0) {
// this causes the stack to well you know exceed the limit
// letsReturnOne();
return 1; // so i don't understand how this is any different
}
return num * solveExponent(num, exp - 1);
}
alert(solveExponent(3, 3));
function letsReturnOne() {
return 1;
}
alert(letsReturnOne());

答案 0 :(得分:5)
当你有这样的代码时
if (exp === 0) {
letsReturnOne();
}
letsReturnOne
返回的值将返回solveExponent
,但由于该值被忽略,solveExponent
继续执行其中的下一个语句,它将调用solveExponent
} exp
为-1
。从那时起,exp
将始终为负数,永远无法达到0
。这就是为什么你的递归永远不会结束。
相反,返回letsReturnOne()
返回的值
if (exp === 0) {
return letsReturnOne();
}
由于letsReturnOne
返回的值立即返回,solveExponent
将不会执行其中的其余语句,当exp
等于0时。
函数评估输入的实际递归方式是这样的,
solveExponent(3, 3)
3 * solveExponent(3, 2)
3 * (3 * solveExponent(3, 1))
3 * (3 * (3 * solveExponent(3, 0)))
此时,exp
为0
,因此我们返回1
,这称为递归的基本情况。
3 * (3 * (3 * 1))
3 * (3 * 3)
3 * 9
27
答案 1 :(得分:1)
return
中的letsReturnOne
仅返回letsReturnOne
的值。它不会隐含地影响solveExponent
内的流量,因此如果没有额外的回报,solveExponent
只会继续运行,直到它再次调用自己的最后一行。
对letsReturnOne
的调用只是一个评估为1
的表达式,所以
if (exp === 0) {
letsReturnOne();
}
相当于
if (exp === 0) {
1;
}
调用return 1;
或1;
之间的区别。