初心者向けにタイトルをわかりやすく説明します。私の問題は一般的な問題と非常によく似ています。整数配列の問題のすべての順列を見つけます。
整数のリストとターゲット番号を指定して、リストから番号の任意の組み合わせを選択して、それらの合計がターゲットと一致するかどうかを調べようとしています。関数型プログラミングの手法を使用して実行する必要があります。つまり、すべてのループとミューテーションが実行され、巧妙な再帰のみが実行されます。完全開示:これは宿題であり、メソッドヘッダーは教授によってそのまま設定されます。これは私が持っているものです:
public static Integer sum(final List<Integer> values) {
if(values.isEmpty() || values == null) {
return 0;
}
else {
return values.get(0) + sum(values.subList(1, values.size()));
}
}
public static boolean groupExists(final List<Integer> numbers, final int target) {
if(numbers == null || numbers.isEmpty()) {
return false;
}
if(numbers.contains(target)) {
return true;
}
if(sum(numbers) == target) {
return true;
}
else {
groupExists(numbers.subList(1, numbers.size()), target);
return false;
}
}
sumメソッドがテストされ、機能しています。groupExistsメソッドが私が取り組んでいるメソッドです。リスト[1,2,3,4]を指定すると、3や10などのターゲットではtrueが返されますが、6ではfalseが返されます。これは、1,2,3が正しいため、混乱します。そして6に追加します。明らかに何かが欠けています。また、私が見ている主な問題は、すべての可能な組み合わせをテストしていないことです。たとえば、最初と最後の数字が可能性として足し合わされていないなどです。
更新:サイモンの答えに基づいて少し働いた後、これは私が見ているものです:
public static boolean groupExists(final List<Integer> numbers, final int target) {
if(numbers == null || numbers.isEmpty()) {
return false;
}
if(numbers.isEmpty()) {
return false;
}
if(numbers.contains(target)) {
return true;
}
if(sum(numbers.subList(1, numbers.size())) == (target - numbers.get(0))) {
return true; }
else {
return groupExists(numbers.subList(1, numbers.size()), target);
}
}