[英]recursion method Stack Overflow error
在我的代碼中,我只是試圖編寫一個簡單的程序,告訴您一個數字是否可以平均划分為另一個數字(在這種情況下,該數字為3)。 現在我說的是,如果x(數字未平均除以0.01),則會給我帶來堆棧溢出錯誤。如果我將值設置為0.2,則表示9實際上是下一個要除的事物數除以3的結果成三成三就是六
public class divisible {
public static void divide(double x) {
double three = 3;
double value = x%three;
if (value==0) {
System.out.println(x + " is a divisible of 3 ");
return;
}else{
//System.out.println("x does not divide evenly into 3");
divide(x+(.01));
}
}
public static void main(String args[]) {
divide(4);
}
}
遞歸無限的原因有點模糊: 0.1
不能精確地表示為double
。 當您將0.1
乘以3
十次時,您得到的不是 4
您得到的數字接近4
,但比它大一點。 這個數字不將你的目標均勻,所以遞歸那張4.1
, 4.2
,依此類推,滿意沒有終點。
原因相同,因此此循環永不停止( 嘗試一下! ):
for (double x = 3 ; x != 4 ; x += 0.1) {
System.out.println(x);
}
使用BigDecimal
代替double
可以解決此問題,因為將精確表示0.1
。 當然,它仍然會打印一條錯誤消息( "is divisible of 3"
是硬編碼的,即使x
在其余部分變為零時在調用中可能是一個完全不同的數字)。
您的問題是您將兩個雙打與==
進行比較。 由於執行浮點運算的方式,這將產生不可靠的結果。 您的方法應如下所示:
public static void divide(int x) {
int three = 3;
int value = x%three;
if (value==0) {
System.out.println(x + " is a divisible of 3 ");
return;
}else{
System.out.println("x does not divide evenly into 3");
// divide(x+(.01));
}
}
如果要使用雙參數訪問該方法,則可以強制轉換為:
public static void divide(double x) {
x = (int) Math.round(x);
如果您希望能夠處理大於Integer.MAX_VALUE
,則可以使用BigInteger
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.