2012-04-25 11 views
0

の最小値を取得する私は私の目的はdoble[] absOfSubのlowst値を取得することですが、それはcompared= Double.compare(d2, d1);は、二重[]

Exception in thread "main" java.lang.StackOverflowError 

なぜオーバーフローラインで次の例外 を与える

次のコードを書きましたそれを修正する方法は?あなたのメソッドの内部 indexの値を変更しないでください

EDIT

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'を実装するのは不自然です。単純な反復的な解決策にそれを直してみませんか? –

+0

@MarkoTopolnikもっと説明を教えてください?もっと簡単にする方法は? – lonesome

答えて

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

あなたのソリューションはよさそうですが、最初の行は** double [] **の最初のインデックスの値に変更する必要があります:P – lonesome

+1

そして、空の配列ですか?デフォルト値は、これをクリーナーにします。いずれにしても、空の配列で呼び出すことが決してない場合、提案された変更は動作に違いをもたらさない。 –

+0

私は変更をしない限り、私自身のprogにコピー/貼り付けました...私の独自の質問はどのように修正されるのですか?それぞれの反復でインデックス値を変更する方法を知っている場合のためだけです:) – lonesome

2

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

0

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

+1

ああ、そうです、インデックスの値を変更しなかった – lonesome

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を意味すると思います。 –

+0

はい、私はそれを変更しました。また、もう少しJavaフレンドリーにしました。 – RadicalRaid

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)]); 
          } 
      } 
      

      EDITあなたが再帰を書いているときは、結果的に起こるすべての呼び出しに対して常に何かを変更し、終了条件に近づけるようにしてください。

    • doubleプリミティブ型自体が比較演算子を定義しているため、Double.compareを使用する必要はありません。
  • +0

    +1その他の注記:はい、あなたのコードと変数の大部分はあなたのクラスだけを意味するので、アクセス指定子はプライベートとして言及することをお勧めします。外の世界にはありません:) –

    +0

    あなたは意味しません** compare(0,1)**? – lonesome

    +0

    'compare(1、0)'で呼び出すと、1回の反復を保存することができます(最初の要素はもう考慮しません)。 –