类似MathPow的Java方法,具有迭代和递归的高效解决方案

类似MathPow的Java方法,具有迭代和递归的高效解决方案,java,performance,recursion,interactive,Java,Performance,Recursion,Interactive,我的作业有问题,我需要帮助 问题1: 完成下面的Java方法,以便raiseToPower(x,n)将数字x提升为整数次幂n(即,计算值xn)。记住x-n=1/xn, x0=1 您应该以尽可能少的步骤数(即O(logn)时间)完成此操作 给出一个非递归(迭代)的解决方案: 这是我的解决方案: public static double raiseToPower (double x, int n) { double res=1; boolean neg=false; if

我的作业有问题,我需要帮助

问题1:

完成下面的Java方法,以便raiseToPower(x,n)将数字x提升为整数次幂n(即,计算值xn)。记住x-n=1/xn, x0=1

您应该以尽可能少的步骤数(即O(logn)时间)完成此操作

给出一个非递归(迭代)的解决方案:

这是我的解决方案:

    public static double raiseToPower (double x, int n) {
double res=1;
     boolean neg=false;
     if(n<0)
     {
         neg=true;

     }
     if(n>0)

         for (int i=0;i<n;i++) {
             res = res * x;
         }
             if(neg==true) {
                 n=n*-1;
                 for (int i=0;i<n;i++) {


                     res = res * x;
                 }
                   res=1/res;
             }


             return res;
}
公共静态双上升功率(双x,整数n){
双res=1;
布尔负=假;
如果(n0)
对于(int i=0;i,可以通过将n分解为2的幂来计算O(logN)x^n,如下所示:

9=1+8

15=1+2+4+8

因此,x^9=(x^1)*(x^8)

为了将n分解为2的幂,可以使用位运算符。例如:n&pow2意味着在n和pow2之间进行“AND”运算,这意味着如果n有位1,pow2也有位1,结果将是非零的。假设pow2必须有一个位1(它是2的幂),你基本上可以检查n的每一位。所以你把n分解成2的幂,你可以简单地保持一个powx,这意味着x^(pow2),当你循环通过2的幂,然后当你发现n确实是由2的幂组成的时候,把它乘以res

因此,我们可以为第一个解决方案编写以下代码:

公共静态双上升功率(双x,整数n){
双res=1;
双功率x=x;
int-pow2=1;
布尔负=假;
如果(n)

结果0.0625


复杂性日志(n)

java.lang.Math.pow()如何?不能使用java.lang.Math.pow()。请参见。它是用于C++/Python的,但您会想出办法。您可以帮助解决这个问题吗?将其更改为递归代码是行不通的。请给我几分钟时间。快速提问,函数的签名是否必须保持“公共静态双重提升能力”(double x,int n)“或者你能添加额外的参数吗?不行,我不能这就是为什么我很难使用它的原因。这就是必须保持公共静态double-raiseToPower(double x,int n)在那之后我就可以写了,我发现这在stackoverflow上已经得到了回答。非常感谢,但是如果是4.7,那么-3的幂应该是0.00963178,而不是4.70000
     public static double raiseToPower (double x, int n) {
ouble dev=0.0;
        if (n == 0) {
            return 1;
        } else {
            if (n < 0) {
              double  count= raiseToPower (x, n+1);
                dev=count*x;
                return 1 / raiseToPower (x, -n);
            }
            if (n > 0) {
             double  count= raiseToPower (x, n-1);
             dev=count*x;



            }

        }
        return dev;
}
public class ExponentialCalculator {

    public static void main(String[] args) {
        double x = 2;
        int n = -4;
        System.out.println(raiseToPower(x, n));
    }

    //Divide and Conquer method
    public static double raiseToPower (double x, int n) {
        if(n==0) {
            return 1;
        }
        double temp = raiseToPower(x, n/2) * raiseToPower(x, n/2);
        if(n%2==0) {
            return n > 0 ? temp: 1/temp;    
        }
        else {
            return n > 0 ? x * temp: 1/(x * temp);
        }
    }
}