了解一种方法如何计算一个数的幂

Posted

技术标签:

【中文标题】了解一种方法如何计算一个数的幂【英文标题】:Understanding How a Method Calculates a Number Raised to a Power 【发布时间】:2020-06-21 14:13:42 【问题描述】:

我遇到了一个解决指数问题的类,但我无法理解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 ,它也可以写成 2*2^2 。希望这会有所帮助 【参考方案1】:

该方法是使用递归将特定的基数提升到一定的幂。

我们以 2^2 为例,运行一下代码:

raiseToPower(2, 2) 被调用

resultVal = 2 * raiseToPower(2, 2 - 1) 正在运行

raiseToPower(2, 1) 被调用

resultVal = 2 * raiseToPower(2, 1 - 1) 正在运行

raiseToPower(2, 0) 被调用

基本情况被击中,我们返回1

现在我们回到链条上!

resultVal = 2 * 1 并返回 2

resultVal = 2 * 2 并返回 4

所以 2^2 的最终结果是预期的 4。

另一种思考方式是假设有人已经给了你 2^2 的答案,你能用它来计算 2^3 吗?是的,你可以简单地做 2 * 2^2!

所以:raisePower(2,3) = 2 * raisePower(2,2)

还有一个基本情况很重要(当功率为 0 时,就像上面的示例一样),这样我们就不会陷入无限循环!希望这会有所帮助。

【讨论】:

baseVal == 0 我们返回 1 时。很多事情都很清楚,但我不清楚如何往上走。 在较小的功率上进行尝试是否有助于您更好地想象它?比如raisePower(2,1) = 2 * raisePower(2,0),你已经知道raisePower(2,0)返回1【参考方案2】:

您缺少的是这是一个调用自身的递归方法。它继续这样做,将中间结果存储在调用堆栈中,直到它开始返回,从堆栈中弹出这些值以形成答案。有时,方法中的打印语句可以帮助您了解发生了什么。

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

【讨论】:

【参考方案3】:

让我们举个例子来理解:

基值 = 2; 指数值 = 3;

我们如何计算 pow(2,3) ,有几种方法:

    baseValue^exponentialValue ---- 2^3 = 8 baseValue x baseValue^exponentialValue-1 ---- 2x2^2 = 8

【讨论】:

【参考方案4】:

这叫做递归。递归调用相同的函数,每次指数递减,乘以基值并添加到结果中。它会像这样运行:

【讨论】:

以上是关于了解一种方法如何计算一个数的幂的主要内容,如果未能解决你的问题,请参考以下文章

如何迅速判断一个数是不是2的幂3的幂4的幂?

如何计算一个矩阵的幂

计算11的1位数到N的幂

快速模取幂

C/C++中如何判断浮点类型相等?

51Nod - 1013 3的幂的和