java 理解一个方法如何计算一个数字的幂

qq24tv8q  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(102)

我遇到了一个解决指数问题的类,但我无法理解方法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()方法可以将一个数提升到幂
谢啦

rjjhvcjd

rjjhvcjd1#

该方法使用递归将特定的基数提升到一定的幂。
让我们举一个简单的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)
还有一点很重要,那就是要有一个基本情况(当power为0时,就像你上面的例子一样),这样我们就不会陷入无限循环!希望这对你有帮助。

mbskvtky

mbskvtky2#

你所忽略的是,这是一个递归方法,它会调用自己。它会继续这样做,将中间结果存储在调用堆栈上,直到它开始返回,从堆栈中弹出这些值以形成答案。有时,方法中的print语句可以帮助你看到发生了什么。

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
4jb9z9bj

4jb9z9bj3#

让我们举个例子并理解:
return 2;return 3;
我们如何计算pow(2,3),有几种方法:

  1. baseValue^exponentialValue ---- 2^3 = 8
  2. baseValue x baseValue^exponentialValue-1 ---- 2x2^2 = 8
5kgi1eie

5kgi1eie4#

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

kqlmhetl

kqlmhetl5#

我在解决这个问题时遇到了同样的问题。直接修复“// calculate math problem”行是:

resultVal = baseVal * raiseToPower(baseVal, (exponentVal-1));

相关问题