2014-01-30 61 views
-2

什麼是遞歸調用的Java成語/模式,我需要在調用中維護一個對象?我看到兩種選擇,但我不喜歡他們中的任何一種。 類似這樣的:什麼是適合遞歸調用的Java習慣用法/模式?

class A { 
    private ArrayList list = new ArrayList(); 

    public ArrayList foo (SomeType x){ 

     if(something) list.add(z); 
     foo(y); 

     return list; 
    } 

} 

或者這個?

class A { 

    public ArrayList foo (SomeType x, ArrayList list){ 
     if (something) list.add(z); 
     foo(y, list); 

     return list; 
    } 

} 

謝謝。

+4

你不需要循環和遞歸。 – Justin

+2

遞歸通常是迭代的替代方法。更重要的是,你在哪裏得到'y'和'z'? –

+0

我認爲你對遞歸如何工作感到困惑。 –

回答

0

我會提供一個public方法,只需要參數SomeType。它創建一個新的ArrayList並將其傳遞給private方法,該方法需要ArrayList並進行實際遞歸。此外,while循環很可能是不必要的。遞歸可以代替使用循環。像這樣的東西應該做的:

public ArrayList foo (SomeType x) { 
    return foo(x, new ArrayList()); 
} 

private ArrayList foo(SomeType x, ArrayList list) { 
    // Perform your recursion here, which probably shouldn't be in a loop. 
    if (someCondition) { 
     list.add(z); 
     foo(y, list); 
    } 
    return list; 
} 

一旦你得到它的工作,你可能需要一個泛型類型參數添加到ArrayList

+0

謝謝,這是我正在尋找的線。你對while循環是正確的 - 對這個例子來說並不重要。所以沒有辦法用局部範圍模擬變量,但是使用靜態壽命? –

0

對於Java來說,沒有遞歸函數的習慣用法。一般來說,遞歸方法的樣子如下:

public <T> recursive(T t){ 
    if(stopConditionMet){ 
     return t; 
    } 
    // modify t and call recursively 
    T nextT = modify(t);   
    return recursive(nextT); 
} 

你在你的問題中演示的是遞歸和迭代方法的混合。不同之處在於迭代方法不會調用它自己,而是在循環中完成所有工作(直到滿足停止條件),這就是爲什麼在大多數情況下,迭代版本是首選的(更便宜和更安全的執行)。

0

你可以的AddRange從遞歸回報:

class A { 

public ArrayList foo (SomeType x) 
{ 
    List list = new ArrayList(); 
    while(/*some conditition*/) 
    { 
     if (something) list.add(z); 
     list.addAll(foo(y)); 
    } 
    return list; 
    } 
} 

如果我理解你的邏輯正確

相關問題