2017-03-16 4 views
3

是否有任何方法可以在不使用addAll的情况下保留每次递归调用的所有值?这是目前我的代码,我一直在挣扎几个小时。在递归调用中保留值java

//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参数我把它添加到一个新的列表,并返回一个新的列表,一旦它完成

回答

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的范围之外的索引自我调用它,然后返回一个新的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); 
} 
+0

当我拨打电话我不是在增量指标? – emmynaki

+0

和其他的呢? @ CraigR8806 – emmynaki

+0

@emmynaki好吧,我会用完整的方法编辑我的答案 – CraigR8806