我想使用递归计算指数。 我有下面的代码可以成功执行。
function pow(base, exponent) {
if (exponent <= 1){
return base
}
else {
return base * pow(base, exponent-1)
}
}
// console.log(pow(3, 5)); // -> answer is 243
我试图在这里理解其他情况。 在 else 语句中,当指数的输入参数为 2 或更高时:
return base * pow(base, exponent-1)
的pow(base, exponent-1)
部分返回什么?它等于基值吗?
所以如果你想计算 'pow(2, 3( -- 即 2 提高到 3 次方,或 8 -- 这个函数可以
(if)
since 1 <= 1 ------+
(else) |
since 2 > 1 ------+ |
| |
(else) | |
since 3 > 1 ------, | |
V V V
pow(2, 3) ---> 2 * pow(2, 2) ---> 2 * 2 * pow(2, 1) ---> 2 * 2 * 2 -> 8
这就是递归的本质:从同一个函数内部(或至少在调用堆栈中的某个地方;参见相互递归示例(调用一个函数,使用在某种程度上更简单的数据;这样最终你就会遇到一个基本情况,你可以在没有这种调用的情况下进行计算。
考虑一下2 ** 3 == 2 * (2 ** 2)
和2 ** 2 == 2 * (2 ** 1)
替代给予:
2 ** 3 == 2 * 2 * (2 ** 1)
这就是你的递归函数所做的一切。当您致电时:
pow(2, 3)
这变成了:
base * pow(2, 2)
pow(2, 2)
变成:
base * pow(2, 1)
替代给予:
base * base * pow(2, 1)
pow(2, 1)
是你的基本情况,等于base
所以最终你得到
pow(2, 3) === base * base * base
理解递归的最佳工具之一是调试。只需逐步查看值如何变化以及堆栈上的内容。
> 这是一个递归函数。考虑数学中的递归函数 F(n(。F(n, m( = n * F(n , m-1(,F(n, 1( = n。因此,代码只是实现此函数。
代码中的 F(n( 是 pow(基数,指数(,其中 n 是基数,m 是指数。
在每次递归时,调用函数时比最初传递的指数少 1。
pow(base, exponent-1)
本质上是从它的初始值倒计时到 1,此时它满足停止递归的条件,并且只返回基数。
if (exponent <= 1){
return base
}
所以如果你通过pow(3, 4(,
递归 1 ( pow(3,4)
(: 3 * // 3
递归 2 ( pow(3,3)
(: 3 * // 9
递归 3 ( pow(3,2)
(: 3 * // 27
递归 4 ( pow(3,1)
(: 3 = // 81