0

私は学校のこの研究室の課題に取り組んでいますが、誰かアドバイスをもらえないかと思っていました. 私のインストラクターは、配列リストからさまざまな数値オブジェクトを追加し、結果を表示することを望んでいます。彼は、非ループ再帰形式で加算を行うことを望んでいます。以前に整数のみでこのような同様の問題を行ったことがありますが、今回はプリミティブ型が複数あるため、この解決策が得られないようです。これが私がこれまでに持っているコードです:

主要:

import java.math.BigInteger;
import java.util.ArrayList;

public class TestSummation {

public static void main(String[] args) {
    ArrayList<Number> aList = new ArrayList<Number>();
    aList.add(new Integer(4));
    aList.add(new Double(3.423));
    aList.add(new Float(99.032));
    aList.add(new BigInteger("32432"));
    double result = Summation.sum(aList);
    System.out.println(result);

}

}

再帰メソッドを保持するクラス:

import java.util.ArrayList;

public class Summation {

public static double sum(ArrayList<Number> aList) {

    if (aList.size() < 1) {
        return 0;
    } else {
        return sum(aList);
    }

}

}

現在、このコードは StackOverflowException をスローしており、誰かが私に役立つアドバイスを持っているかどうか疑問に思っていました. さらに追加する必要があることは確かにわかっていますが、このコードの現在のセクションで正しい軌道に乗っていると感じています。私はちょうど今、悪い障害にぶつかっています。アドバイスをよろしくお願いします!

4

3 に答える 3

1

再帰は、cons 2 つの異なるケースで常に機能します。

  • 再帰を終了するために使用される基本ケース
  • N-th特定のステップに適用される再帰ケース

問題について考えると、サイズ 1 のリストまたはサイズ 0 のリストのいずれかを基本ケースとして考えることができます。簡単にするために最初のものを選択しましょう。サイズ 1 のリストのすべての値の合計が唯一の値です。含まれています。

では、再帰的なケースを見てみましょう: リストが length であるとしますN。私たちが知っていることは、N個の要素のリストのすべての要素の合計は、要素を含むリストの合計に(要素を削除することによって)N-th追加された要素であるというN-1N-thことです。ほとんどの再帰的実装と同様に、それはかなり自明です。

ご覧のとおり、再帰的なステップによってリストのサイズが縮小されるため、アルゴリズムは段階的に基本ケースに到達しますが、これはコードで起こっていることではありません。

于 2013-10-06T21:50:22.497 に答える
1

整数で同様のことを行ったので、問題は多数の数値クラスタイプをどのように処理するかであると思います。結果が必要doubleで、すべてのNumberオブジェクトがdoubleValue()メソッドを実装する必要があるため、それを使用して再帰を構築できます。再帰するには、最初の要素の値を取得し、2 番目の要素で始まるサブリストの (再帰的な) 合計に追加する必要があります。

public class Summation {
    public static double sum(List<Number> aList) {
        final int len = aList.size();
        if (len == 0) {
            return 0;
        }
        final double val = aList.get(0).doubleValue();
        if (len == 1) {
            return val;
        }
        // help future compilers recognize tail recursion
        return val + sum(aList.sublist(1, len));
    }
}
于 2013-10-06T21:59:37.090 に答える
0

リストをまったく変更せず、リストを再帰メソッドに渡すだけで、無限ループが発生するため、コードが例外をスローしていることをお伝えします。追加する必要があるのは、リストを再帰呼び出しに渡す前にリストを変更することです (もちろん、実際の合計も行います)。

于 2013-10-06T21:48:55.343 に答える