1

タイトルが示すように、関数型プログラミングのパラダイムを使用して整数のリストを追加しようとしています。したがって、突然変異はまったくありません。これは宿題であり、メソッドの定義は私の教授によって設定されています。それが私が行き詰まっている理由の一部です。これが私がこれまでに持っているものです。

public static Integer sum(final List<Integer> values) {
     if(values.size() == 1) {
             return values.get(0);
     }
     else {
             List<Integer> tempList;
             tempList = values.subList(0, values.size() - 1);
             return sum(tempList);
     }
 }

リストを返すことしかできず、作成後に変更することはできません。また、汎用リストが使用されているため、コンストラクターにアクセスできません。私はこれを間違った方法で行っている可能性があります。リストの最後の2つの値を追加し、その合計を1インデックス短い新しいリストの最後のスポットに配置する方法を考えています。あなたがこれを行うためのより良い方法を見つけたり、私がそれを感謝する答えに向かって私を押すことができるなら、その宿題は完成したコードブロックを探していません。前もって感謝します。

4

4 に答える 4

4

ブランチelseには、リストの最初の番号を含める必要があります。さらに、への呼び出しの2番目の引数を修正する必要がありますList.sublist。の2つのパラメーターはList.sublist(fromIndex, toIndex)、サブリストを指定します。fromIndex包括的ですが、toIndex排他的です。

于 2012-11-28T19:16:33.753 に答える
1

編集:

なるほど、再帰的な解決策が必要です。if技術的にはステートメントさえ使用しないこのワンライナーを試してみてください。

public static Integer sum(final List<Integer> values) {
     return values.isEmpty() ? 0 : values.get(0) + sum(subList(1, values.size());
}

これはおそらくあなたに9/10のスコアを与えるでしょう。満点の場合は、nullの安全性を追加する必要があります。

public static Integer sum(final List<Integer> values) {
     return values == null || values.isEmpty() ? 0 : values.get(0) + sum(subList(1, values.size());
}

完全な開示、以前私はこれを持っていました:

コードが多すぎます!

public static Integer sum(final List<Integer> values) {
     int total = 0;
     for (int i : values) {
         total += i;
     }
     return total;
}

fyi、自動ボクシングはとの間intでスムーズに変換しますInteger

于 2012-11-28T19:19:18.053 に答える
0

明らかな解決策を確認する方法として、Haskellにリストを追加します。sumは、次の加算を含むフォルダーです。

 sum xs = foldr (+) 0 xs

インラインフォルダ

 sum xs = go (+) 0 xs
     where
         go _ z []     =  z
         go f z (x:xs) =  f x (go f z xs)

(+)に特化

 sum xs = go xs
     where
         go []     = 0
         go (x:xs) = x + (go xs)

インラインで最終的な答えを取得します。

 sum []     = 0
 sum (x:xs) = x + sum xs

これが基本的な再帰的ソリューションです。空のリストまたは1つ以上の要素を持つリストでも同様に機能します。あなたはそれをJavaに直接翻訳することができます(私のJavaはとても錆びています):

 public static Integer sum(final List<Integer> xs) {
     if(xs.size() == 0) {
         return 0;
     } else {
         return xs.get(0) + sum(subList(1, xs.size());
     }
 }
于 2012-11-29T13:43:54.943 に答える
0

あなたの元の答えは非常に近いです。

ヒント:元のリストから最後の要素を除いたサブリストを取得していますが、最後の要素を破棄するだけです。その値を使用することはありません。おそらくそれはサブリストの合計のどこかに含まれるべきですか?(答え=はい)

また、私はおそらくメソッドの一番上にスローインします:

if (values == null || values.isEmpty())
{
  return null;
}
于 2012-11-28T19:34:48.477 に答える