6

さて、私はJavaで再帰に頭を悩ませようとしていて、合計や逆転などの簡単なタスクを実行できますが、この演習を行うのに苦労しています。

再帰を使用して配列内の最小数を見つけようとしていますが、0.0の答えを取得し続けます。

再帰についての私の理解は、1つの要素をインクリメントしてから、再帰を終了する基本ケースを提供する必要があるということです。値を返す必要があるときと、再帰メソッドを呼び出すのが最適なときは、混乱していると思います。

これは私がこれまでに持っているものです:

public static double findMin(double[] numbers, int startIndex, int endIndex) {

double min;
int currentIndex = startIndex++;

if (startIndex == endIndex)
    return numbers[startIndex];

else {
    min = numbers[startIndex];
    if (min > numbers[currentIndex]) {
        min = numbers[currentIndex];
        findMin(numbers, currentIndex, endIndex);
    }
            return min;
}       
} //findMin
4

4 に答える 4

5

簡略版は次のとおりです。

public static double min(double[] elements, int index) {

  if (index == elements.length - 1) {
    return elements[index];
  }

  double val = min(elements, index + 1);

  if (elements[index] < val)
    return elements[index];
  else
    return val;
}
于 2011-04-08T23:23:34.723 に答える
4

このコードには、次のようなさまざまな問題があります。

  • findMin再帰呼び出しの結果は使用しません。
  • startIndexがインクリメントされる前の値に設定されているfindMinため、へのすべての呼び出しで同じになります。currentIndexstartIndex startIndex
  • 配列内のインデックス1の数値が<=インデックス0の数値である場合、再帰呼び出しを行わなくても、その数値を返すだけです。
于 2011-04-08T22:12:55.867 に答える
1

最初の答えに加えて、いくつかの所見:

  • int currentIndex = startIndex++; -ここで最初の要素を見逃してしまいます。一般に、再帰関数への入力を変更する必要はありません。関数を再度呼び出す準備ができたら、入力を処理して新しい値を生成します。つまり、'findMin(numbers、currentIndex + 1、endIndex)'
于 2011-04-08T22:10:39.113 に答える