通过recursion-java添加另一个arraylist的元素

时间:2014-10-21 20:48:03

标签: java list recursion arraylist

这是一个方法,应该简单地创建一个新的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); 
}

除非这不起作用。有任何建议或提示吗?

5 个答案:

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