2015-03-30 65 views
-3

X^N =(X^N/2)^ 2如果n> 0并且n为偶数在math.pow使用递归计算在Java功率

X^N = X *(X^N/2)^ 2如果n> 0且n是奇数

有人可以给我这两个公式的java代码吗?我试图用它做,但我的答案永远是无限的。

这是我的代码

代码:

import java.lang.*; 
public class power4 
{ 
    double ans; 
    public double setpower(double x, double n) { 
    if (n == 0) 
     return 1; 
    else if (n % 2 == 0) 
     return Math.pow(setpower(x, n/2),2); 
    else 
     return x * (Math.pow(setpower(x, n/2),2)); 
    } 
} 

驱动程序类:

public class powerTester 
{ 
    public static void main(String[] args) { 
    power4 test4 = new power4(); 

    System.out.print("2^0 -- "); 
    System.out.print(test4.setpower(2,0)+" "); 

    System.out.println(); 
    System.out.print("2^1 -- "); 
    System.out.print(test4.setpower(2,1)+" "); 

    System.out.println(); 
    System.out.print("2^2 -- "); 
    System.out.print(test4.setpower(2,2)+" "); 

    System.out.println(); 
    System.out.print("2^3 -- "); 
    System.out.print(test4.setpower(2,3)+" "); 

    System.out.println(); 
    System.out.print("2^4 -- "); 
    System.out.print(test4.setpower(2,4)+" "); 

    System.out.println(); 
    System.out.print("2^5 -- "); 
    System.out.print(test4.setpower(2,5)+" "); 
    } 
} 

输出:

Welcome to DrJava. Working directory is C:\Users\Nisarg\Desktop 
> run powerTester 
2^0 -- 1.0  
2^1 -- Infinity  
2^2 -- Infinity  
2^3 -- Infinity  
2^4 -- Infinity 
2^5 -- Infinity > 
+1

我想你想'n'是一个整数。但是,如果你使用'Math.pow',为什么不用它来得到你的答案? – Teepeemm 2015-03-30 21:30:11

+0

@HovercraftFullOfEels这不是一个真正的“给我代码”的问题,这是“这是我所尝试过的,我做错了什么”的问题。它是完整的,可验证的,并指定预期的和实际的输出。所以我认为它不值得接受投票。但是,我也通过在评论中提供答案来破坏规则。 – 2015-03-30 21:40:13

+0

@DavidWallace:够公平的。关闭投票/向下投票。 – 2015-03-30 21:41:42

回答

0

此公式

X^n = X * (X^ (n/2))^2 

依赖于n/2是奇数的整数除法。换句话说,它不需要n ÷ 2但实际上是(n - 1) ÷ 2。通过将n作为double不是一个整数,您可以精确地完成除法工作,而不是整数除法。

这样做的结果是,当n/2达到浮点精度的限制时,此递归才会终止,此时您一次又一次地在X中相乘。结果是一个非常大的数字;太大而无法存储在double中。

为了解决这个问题,您setpower方法的第一行更改为

public double setpower(double x, int n) 

迫使整数除法。