2012-04-25 40 views
0

的最低值我寫了下面的代碼得到一個double []

我的目標是獲得doble[] absOfSub的lowst價值,但它提供了以下異常 在行compared= Double.compare(d2, d1);

Exception in thread "main" java.lang.StackOverflowError 

爲什麼溢出以及如何解決它?

編輯

public class TestThe { 
static double[] absOfSub = new double[5]; 
    private static int index=0; 

    private static int compare(int currentIdx, int minIdx) { 
     if(index < absOfSub.length) { 
     if(absOfSub[currentIdx] < absOfSub[minIdx]) { 
      compare(currentIdx + 1, currentIdx); 
     } else { 
      compare(currentIdx + 1, minIdx); 
     } 
     } 
    return minIdx; 
    } 

    public static void main(String[] args) { 
    absOfSub[0]=1000; 
    absOfSub[1]=810; 
    absOfSub[2]=108; 
    absOfSub[3]=130; 
    absOfSub[4]=110; 
double result; 
    int inndex= compare(0,1); 
     System.out.println(absOfSub[inndex]); 

    } 
} 
+1

即使您的代碼可以修復,但通過Java中的遞歸實現'min'是不自然的。爲什麼不把它重新設計成一個簡單的迭代解決方案呢? – 2012-04-25 08:05:50

+0

@MarkoTopolnik更多解釋?如何使它更簡單? – lonesome 2012-04-25 08:07:27

回答

5

這個簡單而優雅的解決方案如何?

static double min(double... ds) { 
    double min = Double.POSITIVE_INFINITY; 
    for (double d : ds) min = Math.min(min, d); 
    return min; 
} 

public static void main(String[] args) { 
    System.out.println(min(-5.2, 0, -10.1, 3)); 
} 

遞歸解決方案(不推薦!):

static double minRecur(double... ds) { 
    return minRecur(ds, 0, Double.POSITIVE_INFINITY); 
} 
static double minRecur(double[] ds, int i, double runningMin) { 
    return (i < 0 || i >= ds.length)? 
    runningMin : minRecur(ds, i + 1, Math.min(runningMin, ds[i])); 
} 
+0

你的解決方案看起來不錯,但第一行應改爲**雙[]的第一個索引的值**:P – lonesome 2012-04-25 08:15:52

+1

如果你打電話空陣列?默認值使得這個更清潔。無論如何,如果你從不用空數組來調用它,你提出的改變並不會帶來任何行爲上的差異。 – 2012-04-25 08:16:23

+0

但我複製/粘貼到我自己的編,沒有工作,除非我做了改變......順便問一下如何解決我自己的問題?以防萬一知道如何在每次迭代中更改索引值:) – lonesome 2012-04-25 08:17:16

2

你不改變你的方法內部的index值。所以這個遞歸方法調用不會停下來。

0

每個程序中的索引具有0或1或2作爲值。

+1

哦,是的,你是對的,沒有改變指數的價值 – lonesome 2012-04-25 08:08:42

2

其實你不更改索引變量,所以遞歸永遠不會結束。但是這有很多錯誤。

一種簡單通用的方法來找到一個數組中最小的值,而無需使用遞歸:

int min = Integer.MAX_VALUE; 
for(int i = 0; i < array.length; i++) { 
    // Math.min returns the lower value of the two arguments given 
    min = Math.min(min, array[i]); 
} 
return min; 

這可以很容易地調整以適應您的需求。

+1

我想你的意思是array.length這裏,而不是array.length() – 2012-04-25 08:12:20

+0

啊是的,我改變了它。也使它更友好一些Java。 – RadicalRaid 2012-04-25 08:14:47

2

您從不操縱index變量的值。你會看到人們應該嘗試限制他們使用的靜態變量的數量的另一個原因。讓我來幫您:

public class TestThe { 
    private static double[] absOfSub = new double[5]; 
    private static void compare(int currentIdx, int minIdx) { 
     if(currentIdx < absOfSub.length) { 
     if(absOfSub[currentIdx] < absOfSub[minIdx]) { 
      return compare(currentIdx + 1, currentIdx); 
     } else { 
      return compare(currentIdx + 1, minIdx); 
     } 
     } else { 
     return minIdx; 
     } 
    } 

    public static void main(String[] args) { 
     absOfSub[0] = 10; 
     absOfSub[1] = 810; 
     absOfSub[2] = 108; 
     absOfSub[3] = 130; 
     absOfSub[4] = 110; 
     System.out.println("The minimum value is: " + absOfSub[compare(0, 0)]); 
    } 
} 

編輯一些更多的注意事項:

  • 始終指定屬性的訪問爲私有,當您的意圖
  • 總是格式化你的代碼
  • 當你編寫遞歸時,確保你總是爲每個後續的調用改變一些東西,並且它讓你更接近結束條件。
  • double原始類型本身定義了一個比較運算符,在你的情況下不需要使用Double.compare
+0

對於更多的注意事項+1:是的,建議您將訪問說明符稱爲私有,因爲您的大部分代碼和變量僅適用於您的班級。不對外界:) – 2012-04-25 08:13:55

+0

你的意思是**比較(0,1)**? – lonesome 2012-04-25 08:20:21

+0

如果你用'compare(1,0)'調用它(因此不再考慮第一個元素),你可以保存一個迭代,但它也可以按照建議的方式工作。 – 2012-04-25 08:21:41