如何使用remove()方法递归传递列表?

时间:2014-06-10 18:59:06

标签: java recursion

在这个例子中,我试图使用递归来汇总列表的所有元素。但是summation(l.remove(0))存在问题,它必须返回列表的尾部,但不能在此处应用。怎么做正确?

public static Integer summation(List<Integer> list) {
    return (list.isEmpty())
            ? 0
            : list.get(list.size() - 1) + summation(list.remove(0));
}

3 个答案:

答案 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的解决方案,但请注意,此方法可以处理更大的列表,并且不会破坏原始列表。