【发布时间】:2021-09-29 13:24:23
【问题描述】:
我的代码
public boolean canSplitArraySameAverage(ArrayList<Integer> a, ArrayList<Integer> b) {
double aSum = 0, bSum = 0;
for (int it : a) // aSum
aSum = aSum + it;
for (int it : b) // bSum
bSum = bSum + it;
if ((!a.isEmpty() && !b.isEmpty()) && (bSum / b.size() == aSum / a.size())) // Equal Average Possible
return true;
if (b.size() == 1) // Solution not possible, returning on reaching base case
return false;
for (int i = 0; i < b.size(); i++) {
a.add(b.remove(i)); // Transferring element from b to a
// Creating Deep Copies
ArrayList<Integer> newA = (ArrayList<Integer>) a.clone();
ArrayList<Integer> newB = (ArrayList<Integer>) b.clone();
if (canSplitArraySameAverage(newA, newB))
return true; // Early true return
}
System.out.println("Return :" + a);
return false; // Solution not possible, returning after exhausting for loop
}
Logical Flow on how the code should execute
传递值 a[] 和 b[1 2 3 4]
当达到负的基本情况(b[] size = 1)时,我希望 a[] 的值如下
[1 2 3]
[1 2 4]
[1 2]
[1 3 2]
[1 3 4]
[1 3]
and so on
但是我的代码执行为
[1 2 3]
[1 2 4]
[1 3 2]
[1 3]
and terminates
我不确定问题出在哪里,我怀疑它与 return 语句有关。
【问题讨论】:
-
你真的需要for循环吗?你不能只使用递归来处理它吗?尝试删除循环,如果 b 的长度 > 1,则只进行一次传输,然后再次调用该方法。
-
@nordenvall,我相信需要 for 循环才能正确进行分支,但是我可能是错的。我确实尝试删除 for 循环并将更新代码放入其中,但随后它只执行最左边的分支。输出变为 [1 2 3] [1 2] [1]
标签: java recursion arraylist dynamic-programming