递归问题初学者简单的java

时间:2017-03-15 21:43:19

标签: java recursion

我的方法出现了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;
 }

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

4 个答案:

答案 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)方法

中的第一行

这种技术称为重载方法。