0

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

主要的:

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,我想知道是否有人有可以帮助我的建议。我当然知道我需要添加更多内容,但我觉得我在当前代码部分的正确轨道上。我现在只是遇到了一个糟糕的路障。提前感谢您的任何建议!

4

3 回答 3

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));
    }
}
于 2013-10-06T21:59:37.090 回答
1

递归总是在两种不同的情况下起作用:

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

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

现在让我们看看递归情况:假设列表有 length N。我们知道的是,N 个元素列表的所有元素之和是N-th添加到包含元素的列表之和中的N-1元素(通过删除N-th元素)。与大多数递归实现一样,它非常不言自明。

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

于 2013-10-06T21:50:22.497 回答
0

好吧,在不放弃所有内容的情况下,我会告诉您,您的代码正在抛出异常,因为您根本没有修改列表,只是将其传递回您的递归方法,这会导致无限循环。您必须添加的一点涉及在将列表传递给递归调用之前修改列表(当然,还要进行实际的求和)。

于 2013-10-06T21:48:55.343 回答