我寫了一個關于求1/2+2/3+...+i/(i+1)的程序,有兩個方法,一個用遞歸,一個不用,結果精確到0.0001;為什么在i=13和i=20時,兩種方法算出的結果不同?兩個結果相差0.0001.public class Test4_25 {public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("i m(i)"); for(int i=1;i<=20;i++){ double number1=isRecursion(i); double number2=isNotRecursion(i); if(i<10) System.out.println(i+" "+number1+" "+number2); else System.out.println(i+" "+number1+" "+number2); } } static double isRecursion(int number){ if(number==1) return 0.5; else{ double replace=0; replace=number*1.0/(number+1)+isRecursion(number-1); return Math.round(replace*10000)/10000.0; } } static double isNotRecursion(int number){ double sum=0,index=0; for(int i=1;i<=number;i++){ index=i*1.0/(i+1); sum=sum+index; } return Math.round(sum*10000)/10000.0; }}
2 回答

慕尼黑的夜晚無繁華
TA貢獻1864條經驗 獲得超6個贊
因為遞歸方法計算函數中的這句:
return Math.round(replace*10000)/10000.0;
每次遞歸的返回值都被你精確到萬分之一而四舍五入了,這樣會有累積誤差
而循環方法計算的就沒有這個問題,直到最后才四舍五入一次。
正確做法是return Math.round(replace*10000)/10000.0;改成return replace;
遞歸完全返回后,對結果進行一次四舍五入。

慕桂英546537
TA貢獻1848條經驗 獲得超10個贊
簡單說,是因為計算過程的精度不夠
return Math.round(replace*10000)/10000.0; //這可是每次都做round的,而
return Math.round(sum*10000)/10000.0;//這只是在結束的時候做一次round
- 2 回答
- 0 關注
- 249 瀏覽
添加回答
舉報
0/150
提交
取消