我遗漏了什么?我有我的基本情况,看起来“左侧”运行没有问题,但当右侧被执行时,我得到了错误。我是递归的新手,我相信答案是显而易见的,但我似乎找不到它。
基本上,我有一个列表,我试图查看该列表中有多少子集,当添加时,等于常量D。我使用具有true和false值的测试来创建决策树,然后使用该列表来使用全局ArrayList“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
提前感谢!
发布于 2015-06-23 07:57:59
因为向下向右递归不会增加子集的和,所以您的递归可以永远进行下去。如果您一直将false
添加到数组中,您将始终遇到< D
的情况,并且您将始终执行通过rightList
递归的代码。
即使rightList
比您正在查看的实际列表大,calcSumOfList
也不会抛出异常,因为它永远不需要访问test
,因为boolList.get(i)
总是返回false
(因为您的rightList
只填充了false
值)。
当subSetList
与test
大小相同,并且不能再添加时,您需要添加一个基本大小写。
发布于 2015-06-23 07:48:01
这是因为错误行之前的if
语句不正确:
if(calcSumOfList(rightList) < D)
recSubSetSum(rightList); //this is where the error occurs
外部if语句已满足该条件:
else if(calcSumOfList(subSetList) < D){
这是因为您正在将subSetList
的内容复制到rightList
中,并且如果条目为false
,则calcSumOfList
不会添加到列表的值中,从而使rightList
与原始subSetList
具有相同的值。因此,该方法每次都会递归,从而导致StackOverflow。
https://stackoverflow.com/questions/30991582
复制相似问题