在需要跨调用维护对象的情况下,递归调用的适当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;
}
}
感谢。
答案 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;
}
}
如果我理解你的逻辑