雄辩的javascript权力递归样本中的混乱

时间:2017-04-30 17:25:47

标签: javascript recursion

这个递归代码来自雄辩的javascript书

function power(base, exponent) {
  if (exponent == 0) {
    return 1;
  }
  else {
    return base * power(base, exponent - 1);
  }
}

console.log(power(2, 3));

显然指数减少直到达到0,如果它不为零,它会在堆栈上添加电源调用,如果它为零,我开始看到返回值为1然后是2然后是4然后是8.但是如何基数是否乘以指数,基数如何看到指数值?它在其他地方和通电时?

3 个答案:

答案 0 :(得分:0)

  

但是如何将基数乘以指数

它不会乘以exponent

exponent被用作计数器,一旦递归周期减少到0,就会结束递归周期。相反,base自身乘以exponent次。

power()每次调用1base的值都支持此功能。在后一种情况下,再次调用power()以获取1base的另一个副本来乘以。并且,这一直重复,直到它最终返回1作为最终的乘数。

            power(2, 3) ==
        2 * power(2, 2) == // base * ...
    2 * 2 * power(2, 1) == // base * (base * ...)
2 * 2 * 2 * power(2, 0) == // base * (base * (base * ...))
2 * 2 * 2 * 1              // base * (base * (base * (1)))

也可以使用循环定义相同的步骤,但使用1作为初始值而不是最后:

function power(base, exponent) {
    var result = 1;

    while (exponent) {
        result *= base;
        exponent--;
    }

    return result;
}

console.log(power(2, 3)); // 1 * base * base * base == 1 * 2 * 2 * 2 == 8

答案 1 :(得分:0)

你必须注意的是电源功能 当指数为0且
时,返回1 在另一个案例中返回基数* power()。

注意电源功能

在以下代码中

power(base, exponent - 1);

你必须欣赏一些事情

1)如果指数为1,则函数幂返回1,所以在这里

return base * power(base, exponent - 1);

基数是否为2

return 2 * 1

功能电源返回2,所以在下一步

return base * power(base, exponent - 1);

装置

return 2 * 2;

为4,表示功能正在返回4

我想你可以从这里赶上来。

如果您理解,请告诉我:)。

答案 2 :(得分:0)

我发现通过首先查看他们的基本案例然后从那里构建来理解递归过程很容易 - 这是我们正在研究的函数......

function power(base, exponent) {
  if (exponent == 0) {
    return 1;
  }
  else {
    return base * power(base, exponent - 1);
  }
}

所以在这里,基本情况是exponent == 0。我们会将2作为base的输入:

power(2, 0) => 1

那真的很容易!我们所要做的只是评估if声明,我们得出了答案。展望未来,我们看到power通过从指数(exponent - 1)中减去1来达到其基本情况,我们将反转这一点以获得我们的下一个输入 - 所以我们而不是power(2, 0)会做power(2, 1)

power(2, 1) => 2 * power(2, 0)
            => but wait! don't re-evaluate power(2,0)! we already know that answer from above
            => 2 * 1
            => 2

好的,我们将继续通过每次递增指数1来做同样的事情。但要注意不要做不必要的工作 - 如果我们之前已经评估过其中一个表达式,只需用它的评估值替换该表达式

power(2,2) => 2 * power(2, 1)
           => we already know power(2,1) == 2 ...
           => 2 * 2
           => 4

power(2,3) => 2 * power(2,2)
           => we already know power(2,2) == 4, etc
           => 2 * 4
           => 8

power(2,4) => 2 * power(2,3)
           => 2 * 8
           => 16

power(2,5) => 2 * power(2,4)
           => 2 * 16
           => 32

现在我们可以很容易地看到一个模式以及递归过程如何正常工作