Java递归回溯问题
Posted
技术标签:
【中文标题】Java递归回溯问题【英文标题】:Java recursive backtracking problem 【发布时间】:2011-07-25 01:24:39 【问题描述】:这个递归回溯问题有点麻烦:
“编写一个方法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 中删除元素两次的问题。
【问题讨论】:
【参考方案1】:您呼叫list1.remove(i)
两次。这可能会弄乱您的算法,因为您要删除两个数字,并且只保存其中一个以添加到 list2
。
如果它仍然不起作用,我还注意到您忽略了 list1
的最后一个元素作为转到 list2
的候选者。我看不出发生这种情况的算法原因:您应该尝试从 for
循环中删除 -1
。
【讨论】:
【参考方案2】:问题是两次调用list1.remove(i)
。这行不通。
您从list1
中删除了两个数字,而将其保存在list2
中,您只保存了1。
【讨论】:
【参考方案3】:您的递归案例(else
块)应检查是否为 finalAnswer == true
,如果是则立即返回。否则,您将跳过它,直到返回 false
的情况,并最终在底部返回。
这并不能解决整个问题,因为您还要从list1
中删除一个项目两次。解决这两个问题应该会为您提供正确的解决方案。
【讨论】:
【参考方案4】:请原谅我没有直接回答你的问题,但我对所提出问题的理解需要不同的答案。
原来的问题是这样问的: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.
请让我知道我在哪里误解了这个问题。
【讨论】:
子列表的总和相等,元素数量不相等 @hello253,啊,这很有意义。谢谢。以上是关于Java递归回溯问题的主要内容,如果未能解决你的问题,请参考以下文章