この再帰的なバックトラッキングの問題に問題があります。
「整数のリストをパラメーターとして受け取り、再帰的なバックトラッキングを使用して、リストを等しい合計の2つのサブリストに分割できるかどうかを検出するパーティション化可能なメソッドを記述します。指定されたリストを均等に分割できる場合、メソッドはtrueを返す必要があります。そうでない場合はfalse。」
たとえば、リスト[1、2、3]をサブリスト[1、2]、および[3]に分割できるため、「true」の結果が生成されます。
私の解決策は正しいようですが、何があってもfalseを返します。理由がわかりません。
public static boolean partitionable(List<Integer> list1) {
List<Integer> list2 = new ArrayList<Integer>();
return partitionable(list1, list2);
}
public static boolean partitionable(List<Integer> list1, List<Integer> list2) {
boolean finalAnswer = false;
int sum1 = 0;
int sum2 = 0;
for (int i = 0; i < list1.size(); i++) {
sum1 += list1.get(i);
}
for (int i = 0; i < list2.size(); i++) {
sum2 += list2.get(i);
}
if (sum1 == sum2) {
return true;
} else {
for (int i = 0; i < list1.size() - 1; i++) {
int number = list1.remove(i);
list2.add(number);
finalAnswer = partitionable(list1, list2);
list2.remove(list2.size() - 1);
list1.add(i, number);
}
}
return finalAnswer;
}
編集:list1から要素を2回削除する問題を修正しました。