Java 从ArrayList获取一笔金额<;数量>;使用非循环递归

Java 从ArrayList获取一笔金额<;数量>;使用非循环递归,java,recursion,arraylist,Java,Recursion,Arraylist,我正在为学校做这个实验作业,我想知道是否有人能给我一些建议。我的导师希望我们从数组列表中添加不同数量的对象,并显示结果。他希望我们以非循环递归格式进行加法。我以前用整数做过类似的问题,但我似乎无法得到这个解决方案,因为这次有多个基元类型。以下是我目前掌握的代码: 主要内容: import java.math.biginger; 导入java.util.ArrayList; 公共类测试总和{ 公共静态void main(字符串[]args){ ArrayList aList=新的ArrayList

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

主要内容:

import java.math.biginger;
导入java.util.ArrayList;
公共类测试总和{
公共静态void main(字符串[]args){
ArrayList aList=新的ArrayList();
添加(新的整数(4));
增加(新双(3.423));;
增加(新浮动(99.032));
添加(新的大整数(“32432”);
双重结果=求和。求和(列表);
系统输出打印项次(结果);
}
}
类,该类保存递归方法:

import java.util.ArrayList;

public class Summation {

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

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

}

}
import java.util.ArrayList;
公开课总结{
公共静态双和(ArrayList){
如果(列表大小()<1){
返回0;
}否则{
回报金额(aList);
}
}
}

现在这段代码抛出了一个StackOverflowException,我想知道是否有人能给我一些建议。我当然知道我需要添加更多的内容,但我觉得我使用这段代码的方向是正确的。我现在遇到了一个严重的障碍。提前感谢您的建议

好吧,在不透露所有信息的情况下,我将告诉您,您的代码正在抛出异常,因为您根本没有修改列表,只是将其传递回递归方法,这将导致无限循环。您必须添加的位包括在将列表传递到递归调用之前修改列表(当然,还要进行实际的求和)。

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

  • 用于结束递归的基本情况
  • 应用于特定第N步的递归情况
考虑到你的问题,你可以把你的基本情况看作是一个大小为1的列表,或者是一个大小为0的列表。为了简单起见,我们选择第一个:大小为1的列表的所有值之和是它包含的唯一值

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


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

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

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));
    }
}
公共类求和{
公共静态双和(列表列表列表){
final int len=aList.size();
如果(len==0){
返回0;
}
final double val=aList.get(0.doubleValue();
如果(len==1){
返回val;
}
//帮助未来的编译器识别尾部递归
返回值+和(列表子列表(1,len));
}
}

注意:
aList.size()<1
aList.isEmpty()
列表大小为0作为基本大小写,以便处理一个空列表。非常感谢你,Ted!“.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));
    }
}