在这个例子中,我试图使用递归来汇总列表的所有元素。但是summation(l.remove(0))
存在问题,它必须返回列表的尾部,但不能在此处应用。怎么做正确?
public static Integer summation(List<Integer> list) {
return (list.isEmpty())
? 0
: list.get(list.size() - 1) + summation(list.remove(0));
}
答案 0 :(得分:3)
这样可行,但列表最后会为空(如果您想保留原始列表,请使用summation
创建的列表副本对new ArrayList<Integer>(originalList)
进行初始调用)
public static Integer summation(List<Integer> list) {
if (list.isEmpty()) {
return 0;
}
return list.remove(list.size() - 1) + summation(list);
}
答案 1 :(得分:1)
这应该有效
public static Integer summation(List<Integer> list) {
return (list.isEmpty())
? 0
: list.get(list.size() - 1) + summation(list.subList(0, list.size()-1));
}
答案 2 :(得分:1)
如果你有冗长的列表,这个实现可能会更好。将大小为N的问题分解为大小为1和N-1的子问题的递归将快速占用堆栈。此版本将问题分解为两个大小为N / 2的子问题,因此堆栈增长为O(log N)。我能够使用包含1,000,000个值的测试ArrayList
成功运行此项,其他提议的解决方案早已因堆栈溢出而崩溃。
public static Integer summation(List<Integer> list) {
int currentSize = list.size();
if (list.size() > 1) {
int mid = currentSize / 2;
return summation(list.subList(0, mid)) +
summation(list.subList(mid, currentSize));
} else if (currentSize == 1) {
return list.get(0);
} else {
return 0;
}
}
我知道您要求基于remove
的解决方案,但请注意,此方法可以处理更大的列表,并且不会破坏原始列表。