递归调用的适当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;
}
}
如果我了解您的逻辑