2014-10-21 3 views
3

Вот метод, который должен просто создать новый ArrayList, копирующий все элементы параметра ArrayList arrlist, который, я думаю, я сделал правильно.добавление элементов другого arraylist by recursion-java

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

Что такое ошибка? –

+0

«не работает» каким образом? Опишите конкретную проблему, которую вы просите о помощи с –

+1

Есть ли базовый регистр для этой рекурсии? Или он просто называет себя вечно? –

ответ

3

Проблема в том, что вы создаете новый ArrayList в каждой рекурсии. И ты никуда не возвращаешься.

Что вам нужно сделать, в вспомогательном методе также передать цель ArrayList в качестве параметра и добавить к нему, а не новый.

(И, конечно же, не забудьте вернуться, когда закончите).

1

В каждом рекурсивном вызове вы выделяете (массив ArrayList um = new ArrayList();) список массивов. Кроме того, я не могу видеть, когда рекурсивная функция перестанет называть себя

0

Смотрите ниже базовую рекурсивную функцию Фибоначчей:

public int fib(int n) { 
    if(n <= 1) { 
     return n; 
    } else { 
     return fib(n - 1) + fib(n - 2); 
    } 
} 

Это работает как рекурсивная функция, потому что она имеет базовый случай, пути по который функция вернет результат, который не является другим вызовом для себя. Для завершения рекурсивного вызова вам понадобится базовый регистр, когда условие будет выполнено, и верните результаты.

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); 
} 
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); 
} 
Смежные вопросы