这是一个方法,应该简单地创建一个新的ArrayList,复制参数ArrayList arrlist的所有元素,我认为我已经正确完成了。
public ArrayList<T> copy (ArrayList<T> arrlist) {
ArrayList<T> um=new ArrayList<T>();
for (int i=0;i<arrlist.size();i++)
um.add(arrlist.get(i));
return um;
但是,我想在没有循环的情况下使用递归来编写这个完全相同的方法。这是我写的。复制方法使用递归辅助方法。
public ArrayList<T> copy(ArrayList<T> arrlist) {
return copy(arrlist,0);
}
private ArrayList<T> copy(ArrayList<T> arrlist, int n) {
ArrayList<T> um=new ArrayList<T>();
if (n<arrlist.size())
um.add(list.get(n));
return copy(list,n+1);
}
除非这不起作用。有任何建议或提示吗?
答案 0 :(得分:3)
问题是您在每次递归中都创建了一个新的ArrayList
。你不会把它归还给任何地方。
你应该做的是,在辅助方法中,还将目标ArrayList
作为参数传递,并添加到它而不是新的。
(当然,当你完成时别忘了回来。)
答案 1 :(得分:1)
您在每次递归调用中分配(ArrayList um = new ArrayList();)数组列表。 此外,我无法看到递归函数何时停止调用自身
答案 2 :(得分:0)
参见下面的基本递归斐波那契函数:
public int fib(int n) {
if(n <= 1) {
return n;
} else {
return fib(n - 1) + fib(n - 2);
}
}
这是一个递归函数,因为它有一个基本情况,一个路径,函数将返回一个不是对自身的另一个调用的结果。在满足条件时,您需要一个基本案例来完成递归调用,并返回结果。
答案 3 :(得分:0)
试试这个:
private void copy(ArrayList<T> src, ArrayList<T> src_copy, int n) {
if (n>=0){
src_copy.add(src.get(n));
copy(src,src_copy, n-1);
}
}
然后,使用如下:
ArrayList<T> src = ... ; //your arrayList
ArrayList<T> src_copy = new ArrayList<T>();
if (src != null && src.size() > 0) {
copy(src, src_copy, src.size()-1);
}
答案 4 :(得分:0)
我不知道你得到了什么错误。但我认为这应该有用。
public ArrayList<T> copy(ArrayList<T> arrlist) {
ArrayList<T> um = new ArrayList<T>();
return copy(arrlist, um, 0);
}
private ArrayList<T> copy(ArrayList<T> arrlist, ArrayList<T> um, int n) {
if (n < arrlist.size())
um.add(arrlist.get(n));
else
return um;
return copy(arrlist, um, n+1);
}