2017-01-23 48 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