递归函数中的全局变量如何将其保持为零?

时间:2011-01-12 17:43:24

标签: java recursion

所以如果我有一个带有全局变量var _:

的递归函数
int var_;

void foo()
{
  if(var_ == 3)
    return;
  else
    var_++; foo();
}

然后我有一个调用foo()的函数:

void bar()
{
  foo();
  return;
}

每次调用foo时设置var_ = 0的最佳方法是什么,而不是来自内部。我知道我可以这样做:

void bar()
{
  var_ =0;
  foo();
  return;
}

但我正在使用递归函数,我不想调用foo而忘记在以后设置var_ = 0。

有没有人对如何解决这个问题有任何建议?

谢谢,乔希

5 个答案:

答案 0 :(得分:6)

foo()变为辅助功能。

void foo() {
    var_ = 0;
    foo_helper();
}

void foo_helper() {
    if(var_ == 3)
        return;
    else
        var_++; foo_helper();
}

您不必更改任何现有代码,您仍然可以致电foo()并让它继续工作。

答案 1 :(得分:3)

我会将foo()拆分为初始化函数和真正的递归函数:

void foo()
{
    var_ = 0;
    foo_recur();
}

void foo_recur()
{
  if(var_ == 3)
    return;
  else
    var_++; foo_recur();
}

答案 2 :(得分:1)

要添加前两个(非常相似)的答案,只需从类外部看到foo()方法,并将foo_helper()/ foo_recur()保持为私有(var_也应该是私有的) 。如果这是为了在多线程环境中使用,您还应该使foo()同步。

此外,最好将“var_”称为实例或类变量(而不是“全局”)。

答案 3 :(得分:1)

你真的需要这个全局变量吗?

如果它只用于控制递归的深度,你可以用更优雅的方式重写它,如下所示:

void foo()  {
    fooHelper(0);
}

void fooHelper(int var) {
    if (var == 3) return;
    else fooHelper(var + 1);
}

答案 4 :(得分:1)

要让函数知道它是否从内部调用,您可以添加一个参数:

int var_;

void foo(boolean from_itself)
{
 if(!from_itself)
  var_ = 0;
 if(var_ == 3)
  return;
 else
  var_++; foo(true);  // from within itself
}

void bar()
{
 foo(false);  // not from within itself
 return;
}

所以这种方法不需要添加辅助函数。