2014-01-30 38 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; 
    } 
} 

如果我理解你的逻辑正确

相关问题