【问题标题】:What is causing this StackOverflowError?是什么导致了这个 StackOverflowError?
【发布时间】:2015-09-08 14:11:16
【问题描述】:

我错过了什么?我有我的基本情况,看起来“左侧”运行没有问题,但是当右侧执行时出现错误。我对递归还很陌生,我确信答案很明显,但我似乎找不到。

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

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

提前致谢!

【问题讨论】:

  • 当应用程序递归太深时抛出StackOverflowError,请仔细验证您的循环。
  • 您正在检查&lt; D,但它应该是&gt; D,就在注释行之前。

标签: java recursion stack-overflow decision-tree


【解决方案1】:

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

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

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

else if(calcSumOfList(subSetList) < D){

这是因为您将subSetList 的内容复制到rightList 中,如果条目为falsecalcSumOfList 不会添加到列表的值中,从而使rightList 的值与原创subSetList。所以方法每次都会递归,导致StackOverflow。

【讨论】:

    【解决方案2】:

    因为向右下递归永远不会增加子集的总和,所以您的递归可以永远持续下去。如果您继续将false 添加到您的数组中,您将始终遇到&lt; D 的情况,并且您将始终执行在rightList 上递归的代码。

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

    subSetListtest 大小相同且无法再添加时,您需要添加基本情况。

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 2011-02-12
      • 2011-11-27
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2014-11-07
      相关资源
      最近更新 更多