递归时Return(1)的作用是什么?

What does Returning (1) during recursion accomplish?

所以我很难理解递归,我不明白 returning 1 作为最后一步如何结束以下代码。为什么 returning 1 作为最后一步不将“1”分配给 return 值而不是“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());

当你有这样的代码时

if (exp === 0) {
   letsReturnOne();
}

letsReturnOne编辑的值return将return编辑为solveExponent,但由于该值被忽略,solveExponent继续执行它会调用 solveExponentexp 作为 -1 的下一个语句。从此exp永远为负,永远达不到0。这就是为什么你的递归永远不会结束。

相反,return 由 letsReturnOne() 编辑的值 return 像这样

if (exp === 0) {
   return letsReturnOne();
}

由于letsReturnOne编辑的值return立即被return编辑,solveExponent将不会执行其中的其余语句,当exp 等于 0.

函数计算输入的实际递归方式是这样的,

solveExponent(3, 3)
3 * solveExponent(3, 2)
3 * (3 * solveExponent(3, 1))
3 * (3 * (3 * solveExponent(3, 0)))

此时,exp0,所以我们return1,这称为递归的基本情况。

3 * (3 * (3 * 1))
3 * (3 * 3)
3 * 9
27

letsReturnOne 中的 return 只有 return 来自 letsReturnOne 的一个值。它不会隐含地影响 solveExponent 内部的流程,因此如果没有额外的 return,solveExponent 只会继续 运行 直到它再次调用自身的最后一行。

letsReturnOne的调用只是一个计算结果为1的表达式,所以

if (exp === 0) {
   letsReturnOne();
}

等同于

if (exp === 0) {
  1;
}

这就是调用 return 1; 或只调用 1; 的区别。