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 中的某处;参见相互递归示例),使用某种程度上更简单的数据;这样最终您会遇到一个基本情况,您可以在没有此类调用的情况下进行计算。
我想使用递归计算指数。我有下面成功执行的代码。
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 中的某处;参见相互递归示例),使用某种程度上更简单的数据;这样最终您会遇到一个基本情况,您可以在没有此类调用的情况下进行计算。