【问题标题】:How to write a function that can calculate power in Java. No loops如何编写一个可以用 Java 计算幂的函数。没有循环
【发布时间】:2013-10-25 21:32:48
【问题描述】:

我一直在尝试用 Java 编写一个简单的函数,它可以在不使用循环的情况下计算一个数的 n 次方。
然后我发现 Math.pow(a, b) 类...或方法仍然无法区分两者,理论不太好。所以我写了这个..

public static void main(String[] args) {

    int a = 2;

    int b = 31;

    System.out.println(Math.pow(a, b));

    }

然后我想在不使用循环的情况下制作自己的 Math.pow 我希望它看起来比循环更简单,比如使用某种类型的 Repeat 我做了很多直到我遇到我尝试使用 StringUtils.repeat
commons-lang3 包之前的研究 到目前为止,我认为这是语法:-

public static String repeat(String str, int repeat)
    StringUtils.repeat("ab", 2);

我在过去 24 小时 或更长时间内一直面临的问题StringUtils.repeat(String str, int 2); 重复字符串不输出puts、数字或计算。
我可以做些什么来克服这个问题,或者有没有其他更好的方法来创建一个计算幂的函数?
不使用循环或 Math.pow

这可能很有趣,但我花了一段时间才发现 StringUtils.repeat 只重复字符串,这就是我试图克服它的方法。万一它有帮助

 public static int repeat(int cal, int repeat){
     cal = 2+2;
     int result = StringUtils.repeat(cal,2);
     return result;
}  

我可以不使用递归吗?可能是这样的

public static RepeatThis(String a)
{
     System.out.println(a);
     RepeatThis(a);
} 

只是想深入了解 java,感谢您的所有 cmets,即使存在语法错误,只要理解逻辑对我有好处 :)

【问题讨论】:

  • 它被称为StringUtils 的事实应该给你一个提示,它是用于Strings 而不是数字...
  • 如果您尝试重新实现 Math.pow() 以用于学习目的,那么很好,否则请坚持使用此默认实现。你自己写不出更好的。使用非标准实现只会给您的代码增加不必要的复杂性,并使其他人更难理解。
  • @BoristheSpider 是的,你是对的。
  • @Muton 是的,这显然是出于学习目的。我认为重新实现像 Math.pow() 这样的东西没有任何意义,至少不是我的技能水平。但仍然感谢您的建议,提醒这些事情总是好的:)

标签: java repeat exponent


【解决方案1】:

另一个复杂度为 O(Log(n)) 的实现

public static long pow(long base, long exp){        
    if(exp ==0){
        return 1;
    }
    if(exp ==1){
        return base;
    }

    if(exp % 2 == 0){
        long half = pow(base, exp/2);
        return half * half;
    }else{
        long half = pow(base, (exp -1)/2);
        return base * half * half;
    }       
}

【讨论】:

    【解决方案2】:

    尝试递归:

    int pow(int base, int power){
        if(power == 0) return 1;
        return base * pow(base, --power);
    }
    

    【讨论】:

    • 我能不能不使用递归可能像这样 public static RepeatThis(String a) { System.out.println(a);重复这个(一); }
    • 你也可以通过模拟栈来实现。您还应该记住,每次迭代都可以转换为递归,但并非每次递归都可以转换为迭代。随着函数式编程的兴起,递归函数变得越来越重要,所以试试吧。
    • @Craiz 如果你想执行一个操作参数化的次数,你必须循环或递归。没有其他方法可以做到这一点。你认为StringUtils.repeat 会做什么?
    • @user 非常感谢,我已经在研究递归了,但是当你无法按照你第一次想象的方式完成代码时,它真的很烦人哈哈哈
    • @Boris the Spider 是的,我想我现在明白了。如果您检查我的问题,您会发现我对其进行了编辑,我只是​​在最后添加了一些内容。我想只是想把这个逻辑强加到java中。谢谢:)
    【解决方案3】:

    处理具有 O(log(n)) 复杂度的 +/- 指数的函数。

    double power(double x, int n){
     if(n==0)
      return 1;
    
      if(n<0){
          x = 1.0/x;
          n = -n;
      }
     double ret = power(x,n/2);
     ret = ret * ret;
     if(n%2!=0)
       ret = ret * x;
     return ret;
    

    }

    【讨论】:

      【解决方案4】:

      这个处理负指数:

      public static double pow(double base, int e) {
          int inc;
          if(e <= 0) {
              base = 1.0 / base;
              inc = 1;
          }
          else {
              inc = -1;
          }
          return doPow(base, e, inc);
      }
      
      private static double doPow(double base, int e, int inc) {
          if(e == 0) {
              return 1;
          }
          return base * doPow(base, e + inc, inc);
      }
      

      【讨论】:

        【解决方案5】:

        我认为在生产递归中只是不能提供高端性能。

        double power(double num, int exponent)
        {
        
        double value=1;
        int Originalexpn=exponent;
        double OriginalNumber=num;
        
        if(exponent==0)
            return value;
        
        if(exponent<0)
        {
            num=1/num;
            exponent=abs(exponent);
        }
        
        while(exponent>0)
        {
            value*=num;
            --exponent;
        }
        
        cout << OriginalNumber << " Raised to  " << Originalexpn << " is " << value << endl;
        return value;
        

        }

        【讨论】:

        • 然而,这与循环有关。一个while循环,但如果允许while,也很容易构建一个for风格的循环。
        【解决方案6】:

        使用此代码。

        public int mypow(int a, int e){
            if(e == 1) return a;
            return a * mypow(a,e-1);
        }
        

        【讨论】:

          【解决方案7】:

          当然,创建你自己的递归函数:

          public static int repeat(int base, int exp) {
           if (exp == 1) {
            return base;
           }
          
           return base * repeat(base, exp - 1);
          }
          

          数学.pow(a, b)

          Math是类,pow是方法,ab是参数。

          【讨论】:

            【解决方案8】:

            这是一个计算数字幂的 O(log(n)) 代码。使用的算法技术是分而治之。它还接受负幂,即 x^(-y)

            import java.util.Scanner;
            
            public class PowerOfANumber{
                    public static void main(String args[]){
                            float result=0, base;
                            int power;
                            PowerOfANumber calcPower = new PowerOfANumber();
                            /* Get the user input for the base and power */
                            Scanner input = new Scanner(System.in);
                            System.out.println("Enter the base");   
                            base=input.nextFloat();
                            System.out.println("Enter the power");
                            power=input.nextInt();
                            result = calcPower.calculatePower(base,power);
                            System.out.println(base + "^" + power + " is " +result);
                    }   
                    private float calculatePower(float x, int y){ 
                            float temporary;
                            /* Termination condition for recursion */    
                            if(y==0)
                                    return 1;
                            temporary=calculatePower(x,y/2);
                            /* Check if the power is even */
                            if(y%2==0)
                                    return (temporary * temporary);
                            else{
                                    if(y>0)
                                            return (x * temporary * temporary);
                                    else
                                            return (temporary*temporary)/x;
                            }    
                    }
            }
            

            【讨论】:

              【解决方案9】:

              记住definition of the logarithm,如果允许这些功能,可以使用lnexp 来完成。适用于任何正基数和任何实数指数(不一定是整数):

              x = 6.7^4.4
              ln(x) = 4.4 * ln(6.7) = about 8.36
              x = exp(8.36) = about 4312.5
              

              您可以阅读更多herehere。 Java 提供了lnexp

              【讨论】:

                【解决方案10】:

                递归方法是最简单的:

                int power(int base, int exp) {
                    if (exp != 1) {
                        return (base * power(base, exp - 1));
                    } else {
                        return base;
                    }
                }
                

                其中base 是数字,exp 是指数网络

                【讨论】:

                • 谢谢,其他的忘记了。
                • 您不需要else,因为有return。没有括号,这通常是不好的做法,代码不可读。
                • 我添加了括号。顺便说一句,else 对于这个函数是强制性的,否则它不会像条件失败一样编译,它只会返回函数,因为它应该返回一个 int
                • 不,看看其他例子。您需要一个if,但您可以只使用return 而没有else。附:我格式化了你的代码,我真的不明白这有什么困难。
                • 其他示例有效,因为除了if 块中的返回语句之外,还有其他返回语句。所以即使if 失败,int 也会被返回。当然我可以在没有else 的情况下只使用return base,但这不是同样的事情吗?
                猜你喜欢
                • 2018-06-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-10-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多