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

Posted

技术标签:

【中文标题】JavaScript:试图理解计算指数值的递归函数的 Else 语句【英文标题】:JavaScript: Trying to Understand The Else Statement of a Recursion Function Calculating Exponent Value 【发布时间】:2019-06-15 02:08:24 【问题描述】:

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

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 的情况。在 exponent 的输入参数为 2 或更高时的 else 语句中:

return base * pow(base, exponent-1)pow(base, exponent-1) 部分返回什么?它是否等于基础值?

【问题讨论】:

使用参数、基数和指数 - 1 调用您的 pow 函数,并返回乘以基数的结果 fyi,pow(x,0) 返回 x 但应始终返回 1 - 您可以通过将基本情况调整为 if (exponent === 0) return 1 来解决此问题 【参考方案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】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

在每次递归时,调用该函数时使用的指数比最初传递的指数小 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

【讨论】:

以上是关于JavaScript:试图理解计算指数值的递归函数的 Else 语句的主要内容,如果未能解决你的问题,请参考以下文章

计算数字中位数的递归函数

JavaScript 中的递归函数

javascript --- 递归的简单理解

使用递归和 mod 计算指数的算法

JavaScript篇 深入理解JavaScript函数

原始递归函数