2017-03-16 3 views
3

是否有任何方法可以在不使用addAll的情況下保留每次遞歸調用的所有值?這是目前我的代碼,我一直在掙扎幾個小時。在遞歸調用中保留值java

//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參數我把它添加到一個新的列表,並返回一個新的列表,一旦它完成

回答

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的範圍之外的索引自我調用它,然後返回一個新的RecursiveMethodsList

然後,它將開始在列表中做試驗向後和添加元素,即返回,直到它在整個要素列表

這也可以用尾遞歸做工作的方式列表,這是一個更大的內存效率,因爲如果處理得當,會在呼叫的,像這樣的時間釋放每個方法調用的棧幀:

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); 
} 
+0

當我撥打電話我不是在增量指標? – emmynaki

+0

和其他的呢? @ CraigR8806 – emmynaki

+0

@emmynaki好吧,我會用完整的方法編輯我的答案 – CraigR8806