java - 在递归调用java中保留值

标签 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 参数的值,我将它添加到一个新列表并返回它完成后的新列表

最佳答案

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的范围。然后返回一个新的 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);
}

关于java - 在递归调用java中保留值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42832453/

相关文章:

java - 如何通过数据id从Arraylist中删除数据

java - 同一窗口中有 2 个 Maven 项目的 IntelliJ 社区

python - 运行递归二进制搜索算法时出现段错误

list - 忽略列表中的非数字值并找到求和递归方法

java - 从 View 侧填充 GWT 中的树组件

java - 更改包名称后 Android 应用程序崩溃

java - 用Java实现的计算斐波那契数列的算法给出了奇怪的结果

java - 无法理解 Java 示例中的通配符泛型?

java - 减少数组的大小(通过创建新数组) - arrayList 是如何做到的?

java - 代码中惊人的错误