有说服力的javascript power递归示例中的混淆
这个递归代码来自于雄辩的javascript有说服力的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,然后是
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);
}
}