首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >导致此StackOverflowError的原因是什么?

导致此StackOverflowError的原因是什么?
EN

Stack Overflow用户
提问于 2015-06-23 07:32:57
回答 2查看 91关注 0票数 0

我遗漏了什么?我有我的基本情况,看起来“左侧”运行没有问题,但当右侧被执行时,我得到了错误。我是递归的新手,我相信答案是显而易见的,但我似乎找不到它。

基本上,我有一个列表,我试图查看该列表中有多少子集,当添加时,等于常量D。我使用具有true和false值的测试来创建决策树,然后使用该列表来使用全局ArrayList“ArrayList”来查找和。

代码语言:javascript
运行
复制
public void recSubSetSum(ArrayList<Boolean> subSetList){

    if(calcSumOfList(subSetList) == D)
        subsetsFound++;

    else if(calcSumOfList(subSetList) < D){
        for (int i = 0; i < test.size(); i++) {
            ArrayList leftList = new ArrayList<>();
            copyList(leftList, subSetList);

            leftList.add(true);
            if(calcSumOfList(leftList) < D)
                recSubSetSum(leftList);


            ArrayList rightList = new ArrayList<>();
            copyList(rightList, subSetList);

            rightList.add(false);
            if(calcSumOfList(rightList) < D)
                recSubSetSum(rightList); //this is where the error occurs 

        }//for

    }//else

    else{
        subsetsNotFound++;
    }
}


    public int calcSumOfList(ArrayList<Boolean> boolList){
    int sum = 0;
    int j =0; //I used j because it was giving me a outOfBoundsException when I uses i
    for (int i = 0; i < boolList.size(); i++) {
        if(boolList.get(i) == true){
            sum+= test.get(j);

            j++;
        }

    }//for
    return sum;
}//calc sum of list

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2015-06-23 07:57:59

因为向下向右递归不会增加子集的和,所以您的递归可以永远进行下去。如果您一直将false添加到数组中,您将始终遇到< D的情况,并且您将始终执行通过rightList递归的代码。

即使rightList比您正在查看的实际列表大,calcSumOfList也不会抛出异常,因为它永远不需要访问test,因为boolList.get(i)总是返回false (因为您的rightList只填充了false值)。

subSetListtest大小相同,并且不能再添加时,您需要添加一个基本大小写。

票数 1
EN

Stack Overflow用户

发布于 2015-06-23 07:48:01

这是因为错误行之前的if语句不正确:

代码语言:javascript
运行
复制
if(calcSumOfList(rightList) < D)
       recSubSetSum(rightList); //this is where the error occurs 

外部if语句已满足该条件:

代码语言:javascript
运行
复制
else if(calcSumOfList(subSetList) < D){

这是因为您正在将subSetList的内容复制到rightList中,并且如果条目为false,则calcSumOfList不会添加到列表的值中,从而使rightList与原始subSetList具有相同的值。因此,该方法每次都会递归,从而导致StackOverflow。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30991582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档