Java 二进制运算符的操作数类型错误'^';

Java 二进制运算符的操作数类型错误'^';,java,recursion,Java,Recursion,尝试为java课程创建一个将双精度值提升为int幂的递归方法。说明中说“但是,编写代码时,当n为偶数时,方法将返回(x^(n/2))^2。” 这就是我迄今为止所做的: public static double powerFaster(double x, int n) { if (n == 0) { return 1; } else if ((n % 2) == 0) { return

尝试为java课程创建一个将双精度值提升为int幂的递归方法。说明中说“但是,编写代码时,当n为偶数时,方法将返回(x^(n/2))^2。”

这就是我迄今为止所做的:

     public static double powerFaster(double x, int n) {
         if (n == 0) {
            return 1;
         } 
         else if ((n % 2) == 0) {
           return ((x ^ (n / 2.0) ^ 2.0));  //Error occurs here.
         } else {
           return x * powerFaster(x, (n - 1));
         }
     }

^
是异或运算符,而不是幂。对电源使用
Math.pow()

也就是说,我认为你没有抓住练习的重点

您应该
返回powerFaster(x,n/2)*powerFaster(x,n/2)n
为偶数时(实际上进行一次递归调用,将其结果存储在变量中并将其自身相乘)

在Java中,应该使用将值
x
提升到
n


^
是一个运算符-有关详细信息,请参见此

^
是按位异或,与整数一起使用:

int a = 6; //00000110
int b = 5; //00000101
int c = a ^ b; //gives you 3 = 00000011, not 6^5
操作处于二进制级别:

00000110 //a
00000101 //b
--------- XOR
00000011
要执行电源,请使用
Math.pow()


如果您这样做是为了提高速度,那么您应该避免使用
Math.pow
,因为这是您试图替换的函数

要得到一个值的平方,可以执行
d*d

public static void main(String[] args) {
    System.out.println(powerOf(2, 9));
}

public static double powerOf(double d, int n) {
    if (n < 0) return 1 / powerOf(d, -n);

    double ret = 1;
    if (n > 1)
        ret = powerOf(d * d, n / 2);
    if (n % 2 != 0)
        ret *= d;
    return ret;
}

另一方面,不要忘记Math.pow是一个非常繁重的操作,如果您只对正方形或立方体使用它,那么最好使用*运算符,甚至循环

带*操作员的Mult需要4毫秒

Mult和math pow用了717毫秒

带for循环的Mult需要4ms


仅在测试中使用多维数据集操作,执行了一百万次

谢谢您的回答,并让我知道其他的花絮。我想我应该为那个部分实现一个递归方法,但我不确定最好的方法。你的问题是什么?旁注应该是注释而不是答案。很遗憾,我没有足够的因果报应来评论:/
Math.pow(2.0, 1.0) //gives you 2.0
public static void main(String[] args) {
    System.out.println(powerOf(2, 9));
}

public static double powerOf(double d, int n) {
    if (n < 0) return 1 / powerOf(d, -n);

    double ret = 1;
    if (n > 1)
        ret = powerOf(d * d, n / 2);
    if (n % 2 != 0)
        ret *= d;
    return ret;
}
512.0