有没有办法在不使用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参数,我将它添加到一个新的列表中完成后返回新列表
答案 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);
}