在递归调用java中保留值

时间:2017-03-16 11:12:11

标签: java recursion arraylist

有没有办法在不使用addAll的情况下保留每个递归调用的所有值?这是我目前的代码,我几个小时都在苦苦挣扎。

//elements instantiation

public class RecursiveMethodsList<T extends Comparable<T>> { 
private ArrayList<T> elements= new ArrayList<>(); 

我的其余代码:

private RecursiveMethodsList<T> retBetween( int index, T lowerValue, 
     T upperValue){ 

 RecursiveMethodsList<T> list = new RecursiveMethodsList<T>(); 

  if (index < elements.size()){ 

     if (elements.get(index).compareTo(lowerValue) >= 0 &&
           (elements.get(index).compareTo(upperValue)) <= 0){

        list.elements.add(elements.get(index));

     }

     else retBetween(++index, lowerValue, upperValue); 

  }
  return list; 
}

基本上我正在做的是通过一个列表,如果我遇到的值大于或等于我的lowerval参数并且小于或等于我的upperval参数,我将它添加到一个新的列表中完成后返回新列表

1 个答案:

答案 0 :(得分:3)

List成为递归调用的参数之一,如下所示:

private RecursiveMethodsList<T> retBetween(RecursiveMethodsList<T> list, int index, T lowerValue, T upperValue)

当你第一次调用递归方法时,只需发送一个空的List,如下所示:

RecursiveMethodsList<T> returnedList = retBetween(new RecursiveMethodsList<T>(), int index, T lowerValue, 
 T upperValue)

编辑:

以下是我将如何构建方法来完成您要完成的任务:

 private RecursiveMethodsList<T> retBetween(int index, T lowerValue, 
 T upperValue){
      if(index>=elements.size())return new RecursiveMethodsList<T>();

      RecursiveMethodsList<T> lst = retBetween(index+1,lowerValue,upperValue);

      if (elements.get(index).compareTo(lowerValue) >= 0 &&
         (elements.get(index).compareTo(upperValue)) <= 0)
             lst.elements.add(elements.get(index));


      return lst;

 }

我从参数中移除了RecursiveMethodsList<T>,因为在重新阅读您的问题之后,我更了解您究竟想要做什么。

基本上,方法的第一行是基本情况这在递归中很重要,因此它不会继续永远递归。这会一次又一次地调用它,直到它使用超出elements范围的索引调用self,然后返回一个新的RecursiveMethodsList

然后,它将开始通过列表向后进行测试,并将元素添加到正在返回的列表中,直到它在整个元素列表中运行为止

这也可以通过 Tail Recursion 来完成,这是一个更高效的内存,因为如果正确完成,将释放每个方法调用的堆栈帧时像这样打电话:

private RecursiveMethodsList<T> retBetween(RecursiveMethodsList<T> list, int index, T lowerValue, T upperValue){
    if(index>=elements.size())return list;
    if (elements.get(index).compareTo(lowerValue) >= 0 &&
       (elements.get(index).compareTo(upperValue)) <= 0)
            list.elements.add(elements.get(index));

    return retBetween(list, index+1, lowerValue, upperValue);
}