【问题标题】:Retaining values in recursive call java在递归调用java中保留值
【发布时间】:2017-03-16 11:12:11
【问题描述】:

有什么方法可以在不使用 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 参数的值,我将它添加到一个新列表并返回它完成后的新列表

【问题讨论】:

    标签: java recursion arraylist


    【解决方案1】:

    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&lt;T&gt;,因为在重新阅读您的问题后,我对您到底想要做什么有了更好的理解。

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

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

    这也可以用 尾递归 来完成,这是一种更节省内存的方法,因为如果做得好,将在每次调用时释放每个方法调用的堆栈帧像这样调用:

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

    【讨论】:

    • 当我打电话时我不会增加索引吗?
    • 其他的呢? @CraigR8806
    • @emmynaki 好的,我会用完整的方法编辑我的答案
    • @emmynaki 我添加了另一个编辑,解释了如何使用尾递归使其更高效
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2023-01-15
    相关资源
    最近更新 更多