递归问题初学者简单的Java



>我的方法上遇到堆栈溢出错误,我不确定为什么,因为我

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;
}

我不知道为什么会收到错误,也不知道如何从结构上修复它。

保持简单和简短。

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调用。

在传递给递归函数之前,您需要递增索引

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);     
}

在方法的第一行中,将索引设置为 0。

因此,即使您在递归之前递增它,它也将始终设置为 0。

相反,您可能想要的是一个帮助程序方法,如下所示:

private boolean checkIfIncreasing(ArrayList<T> elements) {
return checkIfIncreasing(elements, 0);
}

然后删除checkIfIncreasing(ArrayList<T> elements, int index)方法中的第一行

此技术称为重载方法。

我不知道

为什么会收到错误,我不知道如何 在结构上修复它。

您将index

重置为每次调用方法时0,因此除非elements.size()0,否则此条件if (index < elements.size())将始终为真,在这种情况下,if block中的代码将在每次调用方法时继续重复执行checkIfIncreasing(elements, index++);,最终将抛出StackOverflowException

要防止StackOverflowException只需删除此行:index = 0;