JavaScript:试图理解递归函数计算指数值的 else 语句



我想使用递归计算指数。 我有下面的代码可以成功执行。

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

最新更新