2017-09-05 90 views
0

我想更好地理解遞歸。我正在寫一個基本的幾何系列方法,我知道可以通過循環更容易完成,但這不是目的。該方法正在爲0和1的值生成正確的輸出,僅爲1和1.5。但是對於2,當它應該是1.75時輸出1.25。任何指向更好的方法來處理這個?使用遞歸尋找幾何和

public static double geometricSum(int n) { 
    if(n == 0){ 
     return 1; 
    } 
    n = n * 2; 
    return 1.0/n + geometricSum((int) (1/Math.pow(2, n))); 
} 

回答

0

的第一個問題是爲int,給人錯誤的結果,已經被reyeselda95描述的演員。

也隱藏着第二個問題,這就是,如果你解決,你會得到:

public static double geometricSum(double n) { 
    System.err.println("Calling with " + n); 
    if(n == 0){ 
     return 1; 
    } 
    n = n * 2; 
    return 1.0/n + geometricSum((1/Math.pow(2, n))); 
    } 

與2提供的值調用此,導致循環具有以下值調用之間,導致到堆棧溢出。

... 
Calling with 0.4999999999999999 
Calling with 0.5000000000000001 
Calling with 0.4999999999999999 
Calling with 0.5000000000000001 
... 

這可能是你正在尋找的功能,如果我理解正確:

public static double geometricSum(int count) { 
    if (count == 0) { 
     return 1; 
    } 
    return geometricSum(count-1) + Math.pow(2, -count); 
} 
+0

我脫離的鑄造,但現在我的編輯是說,你能否證實上次的代碼塊適用於你,只是爲了檢查我明白你想要做 –

+0

。感謝您的澄清。 – jrtapsell

+0

問題解決了什麼有錯誤 –

1

發生這種情況是因爲您要將float轉換爲int。

1/(2^2)=1/4=0.25 --> 0 

當你把你的float作爲一個int傳遞時,你不會讓你的東西正常工作。 So 0.25 + geometricSum(0)= 1.25。 在第一個發生相同。你通過了0.5,但變成了一個整數,所以你沒有正確地完成你的aproximation。

作爲一個建議,始終把你的數學函數(),以使程序,而你自己,懂得在責令其計算的數字。

0
  1. 不要投浮法爲int;
  2. 當使用浮動,你確定你的公式是正確的?遞歸休息如果參數爲零,但經過結果1.0/Math.pow(2,N)與功能時,你會得到的StackOverflowError。