遇到这种递归回溯问题的麻烦:
“编写一个方法 partitionable ,它接受一个整数列表作为参数,并使用递归回溯来发现列表是否可以被划分为两个相等和的子列表。您的方法应该返回true如果给定的列表可以被平均分区,如果不是,则为false。“
例如,列表[1,2,3]可以划分为子列表[1,2]和[3],因此它会产生“真”的结果。
我的解决方案似乎是正确的,但无论如何都会返回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中删除元素两次的问题。
答案 0 :(得分:4)
您正在拨打list1.remove(i)
两次。这可能会弄乱您的算法,因为您删除了两个数字,并只保存其中一个数字以添加到list2
。
如果它仍然不起作用,我也注意到你忽略了list1
的最后一个元素作为候选者转到list2
。我没有看到出现这种情况的算法原因:您应该尝试从-1
循环中删除for
。
答案 1 :(得分:1)
问题是两次调用list1.remove(i)
。这不行。
您从list1
删除了两个号码,并将其保存在list2
中,您只能保存1.
答案 2 :(得分:1)
您的递归案例(else
块)应检查是否finalAnswer == true
,如果是这种情况,请立即将其返回。否则,您将跳过返回false
的情况,并最终返回到底部。
这不会解决整个问题,因为您还要从list1
两次删除项目。修复两者应该能为您提供正确的解决方案。
答案 3 :(得分:0)
请原谅我没有直接回答你的问题,但我对提出的问题的理解需要一个不同的答案。
原始问题是这样的:
Your method should return true if the given list can be partitioned equally
你后来声称这个:
[1, 2, 3] can be partitioned into the sublists [1, 2] and [3], so it would produce a result of "true."
这对我来说不合适。适当的解决方案(暂时忽略递归回溯要求)是否计算整数元素的数量% 2
并返回NOT result
?
换句话说:
List has three elements.
Divide by 2, remainder 1.
Return 0, list is not equally dividable.
List has four elements.
Divide by 2, remainder 0.
Return 1, list is equally dividable.
请让我知道我在哪里误解了这个问题。