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



递归调用的适当java iDiom/模式是什么,我需要在调用中维护对象?我看到了两个选项,但我不喜欢他们中的任何一个。这样的东西:

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

谢谢。

i将提供仅采用SomeType参数的public方法。它创建了一个新的ArrayList,并将其传递到采用ArrayList并进行实际递归的private方法。另外,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

没有Java独有的递归函数的成语。通常,递归方法看起来像:

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

您在问题中所证明的是递归和迭代方法的混合体。不同之处在于,迭代方法不称呼自己,而是在循环中进行所有工作(直到达到停止条件),这就是为什么在大多数情况下,迭代版本是首选的(更便宜,更安全地执行)。

您可以在递归返回时添加添加:

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

如果我了解您的逻辑

最新更新