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

时间:2015-02-22 09:46:05

标签: javascript recursion

所以我很难理解递归,我不知道返回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());




2 个答案:

答案 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)))

此时,exp0,因此我们返回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;之间的区别。