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

JavaScript: Trying to Understand The Else Statement of a Recursion Function Calculating Exponent Value

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

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) return 的 pow(base, exponent-1) 部分是什么?它等于基值吗?

考虑 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

理解递归的最佳工具之一是 debugged。只需逐步查看值如何变化以及堆栈中的内容。

在每次递归时,函数被调用时比最初传递的指数小 1。

pow(base, exponent-1)

本质上是从初始值开始倒数到1,此时满足停止递归的条件,只有returns基数。

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

这是一个递归函数。考虑数学中的递归函数 F(n)。 F(n, m) = n * F(n , m-1), F(n, 1) = n。 所以,代码只是实现了这个功能。

代码中的F(n)为pow(base, exponent),其中n为底数,m为指数。

所以如果你想计算 `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

这是递归的本质:从同一个函数内部调用一个函数(或者至少在 call-stack 中的某处;参见相互递归示例),使用某种程度上更简单的数据;这样最终您会遇到一个基本情况,您可以在没有此类调用的情况下进行计算。