Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java递归回溯问题_Java_Recursion_Backtracking - Fatal编程技术网

Java递归回溯问题

Java递归回溯问题,java,recursion,backtracking,Java,Recursion,Backtracking,此递归回溯问题存在一些问题: 编写一个方法partitionable,该方法接受整数列表作为参数,并使用递归回溯来发现列表是否可以划分为两个等和的子列表。如果给定列表可以等分,则该方法应返回true,否则返回false 例如,列表[1,2,3]可以划分为子列表[1,2]和[3],因此它将生成一个“true”的结果 我的解决方案似乎正确,但无论如何都返回false。我不明白为什么 public static boolean partitionable(List<Integer> lis

此递归回溯问题存在一些问题:

编写一个方法partitionable,该方法接受整数列表作为参数,并使用递归回溯来发现列表是否可以划分为两个等和的子列表。如果给定列表可以等分,则该方法应返回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;
}
公共静态布尔分区(列表1){
List list2=新的ArrayList();
返回可分区(列表1、列表2);
}
公共静态布尔可分区(列表列表1、列表列表2){
布尔finalAnswer=false;
int sum1=0;
int-sum2=0;
对于(int i=0;i

编辑:我修复了两次从列表1中删除元素的问题。

您正在调用
list1。删除(I)
两次。这可能会打乱您的算法,因为您删除了两个数字,而只保存其中一个以添加到
list2


如果它仍然不起作用,我还注意到您忽略了
list1
的最后一个元素作为转到
list2
的候选元素。我看不出发生这种情况的算法原因:您应该尝试从
for
循环中删除
-1

您正在调用
列表1。删除(I)
两次。这可能会打乱您的算法,因为您删除了两个数字,而只保存其中一个以添加到
list2


如果它仍然不起作用,我还注意到您忽略了
list1
的最后一个元素作为转到
list2
的候选元素。我看不出发生这种情况的算法原因:您应该尝试从
for
循环中删除
-1

问题在于调用
列表1。删除(I)
两次。这行不通


您正在从
列表1
中删除两个数字,而将其保存在
列表2
中时,您只保存了1

问题是调用
list1。删除(i)
两次。这行不通

您正在从
列表1
中删除两个数字,而将其保存在
列表2
中时,您只保存了1

您的递归case(else
块)应该检查finalAnswer==true,如果是这样,就立即返回它。否则,您将跳过它,返回
false
,并最终在底部返回它

这并不能解决整个问题,因为您还要从
list1
中删除一个项目两次。解决这两个问题应该会得到正确的解决方案。

您的递归案例(else块)应该检查finalAnswer==true,如果是这种情况,则立即返回它。否则,您将跳过它,返回
false
,并最终在底部返回它


这并不能解决整个问题,因为您还要从
list1
中删除一个项目两次。解决这两个问题应该会得到正确的解决方案。

请原谅我没有直接回答您的问题,但我对所提出问题的理解需要不同的答案

原来的问题是这样的:
如果给定列表可以平均分区,则方法应返回true

你后来声称:
[1,2,3]可以划分为子列表[1,2]和[3],因此它将产生一个“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.

请让我知道我在哪里误解了这个问题。

请原谅我没有直接回答你的问题,但我对这个问题的理解需要不同的答案

原来的问题是这样的:
如果给定列表可以平均分区,则方法应返回true

你后来声称:
[1,2,3]可以划分为子列表[1,2]和[3],因此它将产生一个“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.

请让我知道我在哪里误解了这个问题。

子列表的值应该相等,而不是相等的数量elements@hello253啊,现在说起来很有道理。谢谢。子列表的总数相等,而不是数量相等elements@hello253啊,现在说起来很有道理。非常感谢。