有说服力的javascript power递归示例中的混淆

有说服力的javascript power递归示例中的混淆,javascript,recursion,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,然后是

这个递归代码来自于雄辩的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。但是base是如何乘以指数的,base是如何看到指数值的?是在别的地方还是在通电

但基数是如何乘以指数的呢

它不会乘以
指数

指数
被用作一个计数器,一旦递归循环减少到
0
,它就可以结束递归循环。相反,
被自身乘以一个
指数
的次数

每次调用
power()
返回
1
base
的值都支持这一点。在后一种情况下,再次调用
power()
,以获取要乘以的
1
base
的另一个副本。并且,这会重复,直到它最终返回
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

你要注意的是,幂函数 当指数为0且
在另一个案例中返回base*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);
意味着

也就是4,这意味着函数幂返回4

我想你可以从这里赶上


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

我发现通过先查看递归过程的基本情况,然后在此基础上进行构建,很容易理解递归过程——下面是我们正在研究的函数

function power(base, exponent) {
  if (exponent == 0) {
    return 1;
  }
  else {
    return base * power(base, exponent - 1);
  }
}
因此,这里的基本情况是
指数==0
。我们将保留
2
作为
base
的输入:

power(2,0)=>1
那真的很容易!我们所要做的就是评估一个
if
语句,然后得出我们的答案。展望未来,我们会看到
power
通过从指数中减去1(
exponent-1
)得到它的基本情况,我们将反转它以获得我们的下一个输入–因此我们将执行
power(2,0)
而不是
power(2,1)

power(2,1)=>2*power(2,0)
=>但是等等!不要重新评估功率(2,0)!我们已经从上面知道了答案
=> 2 * 1
=> 2
好的,我们将继续做同样的事情,每次增加指数1。但请注意不要做不必要的工作–如果我们之前已经计算过其中一个表达式,只需将该表达式替换为其计算值即可

power(2,2)=>2*power(2,1)
=>我们已经知道幂(2,1)==2。。。
=> 2 * 2
=> 4
功率(2,3)=>2*功率(2,2)
=>我们已经知道幂(2,2)==4,等等
=> 2 * 4
=> 8
功率(2,4)=>2*功率(2,3)
=> 2 * 8
=> 16
功率(2,5)=>2*功率(2,4)
=> 2 * 16
=> 32

现在我们可以很容易地看到一种模式,以及递归过程通常是如何工作的

power(2,3)
2*power(2,2)
2*2*power(2,1)
2*2*1,因为
power(2,0)
返回
1
。您可以在调试器中单步执行。@OliverCharlesworth是的,我确实查看了很多次,但不知怎么的,我仍然感到困惑
function power(base, exponent) {
  if (exponent == 0) {
    return 1;
  }
  else {
    return base * power(base, exponent - 1);
  }
}