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 语句的主要内容,如果未能解决你的问题,请参考以下文章