簡體   English   中英

遞歸方法堆棧溢出錯誤

[英]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.14.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM