在递归期间返回(1)完成了什么?

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)

the*_*eye 5

当你有这样的代码

if (exp === 0) {
   letsReturnOne();
}
Run Code Online (Sandbox Code Playgroud)

从返回的值letsReturnOne将返回solveExponent,但由于价值被忽略,solveExponent继续执行在它的下一个报表,它会调用solveExponentexp作为-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)

在这一点上,exp0,所以我们返回1,这被称为递归的基本情况.

3 * (3 * (3 * 1))
3 * (3 * 3)
3 * 9
27
Run Code Online (Sandbox Code Playgroud)