use*_*373 1 javascript recursion
所以我很难理解递归,我没有看到如何返回1作为最后一步,包装以下代码.为什么不返回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());Run Code Online (Sandbox Code Playgroud)
当你有这样的代码
if (exp === 0) {
letsReturnOne();
}
Run Code Online (Sandbox Code Playgroud)
从返回的值letsReturnOne将返回solveExponent,但由于价值被忽略,solveExponent继续执行在它的下一个报表,它会调用solveExponent与exp作为-1.从那时起,exp永远是负面的,永远无法达到0.这就是为什么你的递归永远不会结束的原因.
相反,返回letsReturnOne()像这样返回的值
if (exp === 0) {
return letsReturnOne();
}
Run Code Online (Sandbox Code Playgroud)
由于返回的值letsReturnOne是立即返回的,solveExponent因此当exp它等于0 时,不会执行其中的其余语句.
函数评估输入的实际递归方式是这样的,
solveExponent(3, 3)
3 * solveExponent(3, 2)
3 * (3 * solveExponent(3, 1))
3 * (3 * (3 * solveExponent(3, 0)))
Run Code Online (Sandbox Code Playgroud)
在这一点上,exp是0,所以我们返回1,这被称为递归的基本情况.
3 * (3 * (3 * 1))
3 * (3 * 3)
3 * 9
27
Run Code Online (Sandbox Code Playgroud)