递归调用的适当Java习语/模式是什么?

时间:2014-01-30 18:48:56

标签: java recursion

在需要跨调用维护对象的情况下,递归调用的适当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;
   }

}

感谢。

3 个答案:

答案 0 :(得分:0)

对于Java来说,递归函数没有任何习惯用法。通常,递归方法的方式如下:

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

您在问题中展示的是递归和迭代方法的混合。不同之处在于迭代方法不会调用自身,而是在循环中完成所有工作(直到满足停止条件),这就是为什么在大多数情况下,迭代版本是首选的(执行起来更便宜,更安全) )。

答案 1 :(得分: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

中添加泛型类型参数

答案 2 :(得分:0)

你可以在递归返回时添加范围:

 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;
  }
}

如果我理解你的逻辑