【发布时间】:2019-10-25 01:11:03
【问题描述】:
我对递归回溯非常陌生,但我想我会尝试一下。我编写了这段代码,它找到从低到高(作为参数传入)的整数的所有排列,这些排列总和为给定的 int,NumTotal。它适用于较小的数字,但我得到了
线程“主”java.lang.OutOfMemoryError 中的异常:超出 GC 开销限制
对于更大的数字。
public static void findAllSolutionMethod(int NTotal, ArrayList<ArrayList<Integer>> solutions,
ArrayList<Integer> currentSolution, int lower, int upper) {
// success base case
if (NTotal == 0) {
ArrayList<Integer> copy = new ArrayList<Integer>();
// creates deep copy
for (int i = 0; i < currentSolution.size(); i++) {
copy.add(currentSolution.get(i));
}
// add to solutions arraylist
solutions.add(copy);
return;
}
// invalid number base case (number added too big)
else if (NTotal < 0) {
return;
}
else {
// iterates through range of numbers
for (int i = lower; i <= upper; i++) {
currentSolution.add(i);
findAllSolutionMethod(NTotal - i, solutions, currentSolution, lower, upper);
currentSolution.remove(currentSolution.size() - 1);
}
}
}
有什么办法可以优化这段代码,使其不占用太多空间?
【问题讨论】:
-
solutions.add(new ArrayList<>(currentSolution));将是“创建深层副本”的更简单方法。它也可能更节省内存,因为它可以预先调整支持列表副本的数组大小。
标签: java recursion permutation