我的方法出现了stackoverflow错误,我不确定为什么,因为我的
if (index < elements.size())
行确保它不是无限递归调用。到目前为止这是我的代码。
private boolean checkIfIncreasing(ArrayList<T> elements, int index){
index = 0;
boolean currentReturnVal = false;
//element at position 0 of the passed in array
T objAtIndex = elements.get(index);
//element at position 1 of the passed in array
T objAtNextIndex = elements.get(index + 1);
//if the size is 1 then just return true bc its the only element in there
if (elements.size() == 1){ currentReturnVal = true;}
if (index < elements.size()){ //takes care of non infinite "looping"
//checks to see if obj at index 0 is less than or equal to obj 1
if (objAtIndex.compareTo(objAtNextIndex) <= 0){
currentReturnVal = true;}
checkIfIncreasing(elements, index++);
if (objAtIndex.compareTo(objAtNextIndex) >= 0){
return false; }
}
return currentReturnVal;
}
我不知道为什么我收到错误,我不知道如何在结构上修复它。
答案 0 :(得分:1)
保持简单和简短。
private boolean checkIfIncreasing(List<T> elements, int index) {
if (elements.size() < 2 || index + 1 == elements.size())
return true;
if (elements.get(index).compareTo(elements.get(index+1)) < 1)
return checkIfIncreasing(elements, index+1);
return false;
}
应使用索引0
调用此方法。
答案 1 :(得分:1)
您需要在传递递归函数之前递增索引
private boolean checkIfIncreasing(ArrayList<T> elements, int index){
// check if array has at least 2 elements first, ot you will get an exception
if (elements.size() <=1 || index >= elements.size() ){ return true;}
//checks to see if obj at index 0 is less than obj 1
if (objAtIndex.compareTo(objAtNextIndex) < 0){
// if any obj[x] is smaller than obj[x+1]
return false;
}
// here element index and index+1 are either in incremental order or equal
return checkIfIncreasing(elements, ++index);
}
答案 2 :(得分:0)
我不知道为什么我收到错误,我不知道该怎么做 在结构上修复它。
您在每次调用方法时都会将index
重置为0
,因此除非if (index < elements.size())
)elements.size(
,否则此条件0
将始终为真在这种情况下,if block
内的代码会在每次调用方法时反复执行checkIfIncreasing(elements, index++);
,最终会抛出StackOverflow
Exception
。
阻止StackOverflow
Exception
删除此行:index = 0;
答案 3 :(得分:0)
在方法的第一行中,将索引设置为0。
因此即使在递归之前递增它,它也总是设置为0.
相反,你可能想要的是一个辅助方法,如下所示:
private boolean checkIfIncreasing(ArrayList<T> elements) {
return checkIfIncreasing(elements, 0);
}
然后删除checkIfIncreasing(ArrayList<T> elements, int index)
方法
这种技术称为重载方法。