理解方法如何计算一个数的幂
Understanding How a Method Calculates a Number Raised to a Power
我遇到了解决指数问题的 class,但我无法理解方法 raiseToPower()
的工作原理。这是我不明白的行:resultVal = baseVal * raiseToPower(baseVal,exponentVal-1);
baseVal
乘以什么? raiseToPower(baseVal,exponentVal-1)
对我来说似乎不是一个表达。如果 baseVal == 2
,那么 raiseToPower(baseVal,exponentVal-1)
是什么?
我知道如何在脑海中解决 2^3,但我很难理解 baseVal * raiseToPower(baseVal,exponentVal-1)
解决问题的步骤。我知道每次调用 raiseToPower()
时 exponentVal
都会减 1,但我仍然不明白它是如何保存一个可以乘以 baseVal
的值。
我知道这个递归方法的行为就像一个循环。
public class ExponentMethod {
// calculates the result of raising a number to a power
public static int raiseToPower(int baseVal, int exponentVal) {
int resultVal; // holds the answer to the exponent problem
// sets resultVal to 1
if (exponentVal == 0) {
resultVal = 1;
}
else {
// calculate math problem
resultVal = baseVal * raiseToPower(baseVal,exponentVal-1);
}
// returns when exponentVal == 0
return resultVal;
}
public static void main (String [] args) {
int userBase;
int userExponent;
userBase = 2;
userExponent = 3;
System.out.println(userBase + "^" + userExponent + " = "
+ raiseToPower(userBase, userExponent));
}
}
// output
2^3 = 8
我知道有一个 pow() 方法可以提高一个数的幂
谢谢,
让我们举个例子来理解:
基础值=2;
指数值 = 3;
我们如何计算 pow(2,3) ,有很多方法:
- baseValue^exponentialValue ---- 2^3 = 8
- baseValue x baseValue^exponentialValue-1 ---- 2x2^2 = 8
这叫做递归。递归调用相同的函数,每次递减指数,乘以基值并添加到结果中。它会 运行 像这样:
您缺少的是这是一个调用自身的递归方法。它继续这样做,将中间结果存储在调用堆栈中,直到它开始 return,从堆栈中弹出这些值以形成答案。有时,方法中的打印语句可以帮助您了解发生了什么。
public static void main(String[] args) {
System.out.println(raiseToPower(3,4));
}
public static int raiseToPower(int baseVal, int exponentVal) {
if (exponentVal == 0) {
return 1;
}
int x = baseVal * raiseToPower(baseVal, exponentVal-1);
System.out.println("exponentVal = " + exponentVal + ", + x = " + x);
return x;
}
打印
exponentVal = 1, + x = 3
exponentVal = 2, + x = 9
exponentVal = 3, + x = 27
exponentVal = 4, + x = 81
81
当 exponentVal == 0 时递归调用展开,这就是你得到的结果
x = 1;
x = x * baseVal; // x = baseVal
x = x * baseVal; // x = baseVal ^ 2
x = x * baseVal; // x = baseVal ^ 3
x = x * baseVal; // x = baseVal ^ 4
// return x or 81
该方法是使用递归将特定基数提高到某个幂。
我们通过代码来举个简单的2^2和运行的例子:
raiseToPower(2, 2)
被称为
resultVal = 2 * raiseToPower(2, 2 - 1)
是 运行
raiseToPower(2, 1)
被称为
resultVal = 2 * raiseToPower(2, 1 - 1)
是 运行
raiseToPower(2, 0)
被称为
基本案例被击中,我们 return 1
现在我们回到链条上!
resultVal = 2 * 1
并且 2 是 returned
resultVal = 2 * 2
并且 4 是 returned
所以 2^2 的最终结果是预期的 4。
另一种思考方式是假设有人已经给了你 2^2 的答案,你能用它来计算 2^3 吗?是的,你可以简单地做 2 * 2^2!
所以:raisePower(2,3) = 2 * raisePower(2,2)
重要的是还有一个基本情况(当幂为 0 时,就像上面的示例一样),这样我们就不会 运行 陷入无限循环!希望这会有所帮助。
我遇到了解决指数问题的 class,但我无法理解方法 raiseToPower()
的工作原理。这是我不明白的行:resultVal = baseVal * raiseToPower(baseVal,exponentVal-1);
baseVal
乘以什么? raiseToPower(baseVal,exponentVal-1)
对我来说似乎不是一个表达。如果 baseVal == 2
,那么 raiseToPower(baseVal,exponentVal-1)
是什么?
我知道如何在脑海中解决 2^3,但我很难理解 baseVal * raiseToPower(baseVal,exponentVal-1)
解决问题的步骤。我知道每次调用 raiseToPower()
时 exponentVal
都会减 1,但我仍然不明白它是如何保存一个可以乘以 baseVal
的值。
我知道这个递归方法的行为就像一个循环。
public class ExponentMethod {
// calculates the result of raising a number to a power
public static int raiseToPower(int baseVal, int exponentVal) {
int resultVal; // holds the answer to the exponent problem
// sets resultVal to 1
if (exponentVal == 0) {
resultVal = 1;
}
else {
// calculate math problem
resultVal = baseVal * raiseToPower(baseVal,exponentVal-1);
}
// returns when exponentVal == 0
return resultVal;
}
public static void main (String [] args) {
int userBase;
int userExponent;
userBase = 2;
userExponent = 3;
System.out.println(userBase + "^" + userExponent + " = "
+ raiseToPower(userBase, userExponent));
}
}
// output
2^3 = 8
我知道有一个 pow() 方法可以提高一个数的幂
谢谢,
让我们举个例子来理解:
基础值=2; 指数值 = 3;
我们如何计算 pow(2,3) ,有很多方法:
- baseValue^exponentialValue ---- 2^3 = 8
- baseValue x baseValue^exponentialValue-1 ---- 2x2^2 = 8
这叫做递归。递归调用相同的函数,每次递减指数,乘以基值并添加到结果中。它会 运行 像这样:
您缺少的是这是一个调用自身的递归方法。它继续这样做,将中间结果存储在调用堆栈中,直到它开始 return,从堆栈中弹出这些值以形成答案。有时,方法中的打印语句可以帮助您了解发生了什么。
public static void main(String[] args) {
System.out.println(raiseToPower(3,4));
}
public static int raiseToPower(int baseVal, int exponentVal) {
if (exponentVal == 0) {
return 1;
}
int x = baseVal * raiseToPower(baseVal, exponentVal-1);
System.out.println("exponentVal = " + exponentVal + ", + x = " + x);
return x;
}
打印
exponentVal = 1, + x = 3
exponentVal = 2, + x = 9
exponentVal = 3, + x = 27
exponentVal = 4, + x = 81
81
当 exponentVal == 0 时递归调用展开,这就是你得到的结果
x = 1;
x = x * baseVal; // x = baseVal
x = x * baseVal; // x = baseVal ^ 2
x = x * baseVal; // x = baseVal ^ 3
x = x * baseVal; // x = baseVal ^ 4
// return x or 81
该方法是使用递归将特定基数提高到某个幂。
我们通过代码来举个简单的2^2和运行的例子:
raiseToPower(2, 2)
被称为
resultVal = 2 * raiseToPower(2, 2 - 1)
是 运行
raiseToPower(2, 1)
被称为
resultVal = 2 * raiseToPower(2, 1 - 1)
是 运行
raiseToPower(2, 0)
被称为
基本案例被击中,我们 return 1
现在我们回到链条上!
resultVal = 2 * 1
并且 2 是 returned
resultVal = 2 * 2
并且 4 是 returned
所以 2^2 的最终结果是预期的 4。
另一种思考方式是假设有人已经给了你 2^2 的答案,你能用它来计算 2^3 吗?是的,你可以简单地做 2 * 2^2!
所以:raisePower(2,3) = 2 * raisePower(2,2)
重要的是还有一个基本情况(当幂为 0 时,就像上面的示例一样),这样我们就不会 运行 陷入无限循环!希望这会有所帮助。