有没有办法在不使用 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/