2017-01-23 44 views
-1

在我的班级中,我尝试以2种方式返回总和:2^n + 2^(n+1) + 2^(n+2) ...。 在第一种方法中迭代,在第二种方法中递归。来自类似方法的不同结果

只要数字不是太大,就可以工作。有人可以向我解释为什么这些方法在使用高数字时会返回不同的答案?我也想知道哪一个给我总是正确的答案。

public class Power 
{ 
    public static void main(String[] args) 
    {  
     System.out.println(iterativ(3)); 
     System.out.println(rekursiv(3)); 

     System.out.println(iterativ(40)); 
     // The recursive one is lower by 10 
     System.out.println(rekursiv(40)); 
    } 

    public static int iterativ(int x) 
    { 
     int sum = 0; 
     for (int i = 0; i <= x; i++) { 
      sum += Math.pow(2, i); 
     } 
     return sum; 
    } 

    public static int rekursiv(int x) 
    {   
     if (x > 0) { 
      return ((int) Math.pow(2, x) + rekursiv(x - 1)); 
     } 
     return 1; 
    } 
} 
+2

“我也想知道哪一个给我总是正确的答案。” - 我猜这就是你的工作;) - 编辑:刚才看到你的代码基本上包含了我要求的例子。 – Thomas

+0

调试器和'println()'是你最好的朋友! – alex

+1

至少有一个显而易见的原因,用'double'代替'int'来试试你的代码:int的最大值是2^31-1,明显低于你正在尝试的2^40。因此你会得到一个'int'溢出。尽管失去了一些精确度,“double”仍然能够代表这些数值。或者使用'long',它允许值高达2^63-1(即,你的代码应该工作到x = 62)。 – Thomas

回答

2

您正在使用处理double的函数。您正在将您的值转换为int。如果你从double投射到int,投射值迟早总会导致一些不准确的结果。

使用40作为指数时看到的数字是2147483647,实际上是Integer.MAX_VALUE,但不是2^40。这相当于2^31-1。 java教程有一个关于the primitive datatypes的章节,它向您展示了每种类型的范围。

除了使用double你也可以看看BigDecimal