0

私は次のコードを書きました

私の目的はの最低値を取得することですがdoble[] absOfSub、行で次の例外が発生します 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]);
    
    }
}
4

5 に答える 5

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]));
}
于 2012-04-25T08:09:03.340 に答える
2

indexメソッド内の値は変更しません。したがって、この再帰的なメソッド呼び出しはまったく停止しません。

于 2012-04-25T08:04:24.277 に答える
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します。あなたの場合は使用する必要はありません。
于 2012-04-25T08:10:35.087 に答える
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;

これは、ニーズに合わせて簡単に調整できます。

于 2012-04-25T08:10:21.300 に答える
0

各ルーチンのインデックスは、値として0または1または2のいずれかを持っています。

于 2012-04-25T08:06:17.100 に答える