使用非循环递归</number>从ArrayList <number>获取总和

时间:2013-10-06 21:45:46

标签: java recursion arraylist

我正在为这所学校的实验室工作而工作,我想知道是否有人可以给我一些建议。我的导师希望我们从数组列表中添加不同的数字对象并显示结果。他希望我们以非循环递归格式进行添加。我之前只用整数做了类似的问题,但我似乎无法得到这个解决方案,因为这次有多个原始类型。这是我到目前为止的守则:

主:

import java.math.BigInteger;
import java.util.ArrayList;

public class TestSummation {

public static void main(String[] args) {
    ArrayList<Number> aList = new ArrayList<Number>();
    aList.add(new Integer(4));
    aList.add(new Double(3.423));
    aList.add(new Float(99.032));
    aList.add(new BigInteger("32432"));
    double result = Summation.sum(aList);
    System.out.println(result);

}

}

包含递归方法的类:

import java.util.ArrayList;

public class Summation {

public static double sum(ArrayList<Number> aList) {

    if (aList.size() < 1) {
        return 0;
    } else {
        return sum(aList);
    }

}

}

现在这段代码抛出一个StackOverflowException,我想知道是否有人有建议可以帮助我。我当然知道我需要添加更多内容,但我觉得我现在正在使用当前的代码段。我现在正在遇到一个糟糕的障碍。提前感谢任何建议!

3 个答案:

答案 0 :(得分:1)

递归始终通过两种不同的情况起作用:

  • 用于结束递归的基本案例
  • 应用于特定N-th步骤
  • 的递归案例

通过考虑您的问题,您可以将大小为1的列表或大小为0的列表视为基本情况。为简单起见,我们选择第一个:列表中所有值的总和大小为1是唯一包含的值

现在让我们查找递归情况:假设列表的长度为N。我们所知道的是, N个元素列表中所有元素的总和是添加到包含N-th元素的列表总和的N-1元素(通过删除N-th元件)即可。它与大多数递归实现一样具有很强的自我解释性。

正如您所看到的,递归步骤减小了列表的大小,使算法逐步达到基本情况,这不是您的代码所发生的事情。

答案 1 :(得分:1)

由于你已经用整数做了类似的事情,我认为问题在于如何处理大量的数字类型。由于您需要double结果且所有Number个对象必须实现doubleValue()方法,因此您可以使用它来构建递归。要递归,您需要获取第一个元素的值并将其添加到以第二个元素开头的子列表的(重复)总和中:

public class Summation {
    public static double sum(List<Number> aList) {
        final int len = aList.size();
        if (len == 0) {
            return 0;
        }
        final double val = aList.get(0).doubleValue();
        if (len == 1) {
            return val;
        }
        // help future compilers recognize tail recursion
        return val + sum(aList.sublist(1, len));
    }
}

答案 2 :(得分:0)

好吧,如果不全力以赴,我会告诉你,你的代码抛出了异常,因为你根本没有修改列表,只是将它传回你的递归方法,这会导致无限循环。您必须添加的位包括在将列表传递给递归调用之前修改列表(当然,还要进行实际求和)。