Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归函数中的全局变量如何保持为零?_Java_Recursion - Fatal编程技术网

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

Java 递归函数中的全局变量如何保持为零?,java,recursion,Java,Recursion,因此,如果我有一个带有全局变量var的递归函数: int var_; void foo() { if(var_ == 3) return; else var_++; foo(); } 然后我有一个调用foo()的函数,所以: 每次调用foo时设置var_uz=0的最佳方法是什么?这不是从内部进行的。我知道我可以做到: void bar() { var_ =0; foo(); return; } 但是我经常使用递归函数,我不想调用foo而忘记在以后设置va

因此,如果我有一个带有全局变量var的递归函数:

int var_;

void foo()
{
  if(var_ == 3)
    return;
  else
    var_++; foo();
}
然后我有一个调用foo()的函数,所以:

每次调用foo时设置var_uz=0的最佳方法是什么?这不是从内部进行的。我知道我可以做到:

void bar()
{
  var_ =0;
  foo();
  return;
}
但是我经常使用递归函数,我不想调用foo而忘记在以后设置var_uz=0

有人对如何解决这个问题有什么建议吗

谢谢,Josh将
foo()
转换为助手函数

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

void foo_helper() {
    if(var_ == 3)
        return;
    else
        var_++; foo_helper();
}
您不必更改任何现有代码,您仍然可以调用
foo()
,让它工作。

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

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

void foo_recur()
{
  if(var_ == 3)
    return;
  else
    var_++; foo_recur();
}
要添加到您得到的前两个(惊人相似的)答案中,请仅使foo()方法在类外部可见,并将foo_helper()/foo_recur()保持为私有(var_u也应为私有)。如果要在多线程环境中使用,还应该使foo()同步


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

您真的需要这个全局变量吗

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

void foo()  {
    fooHelper(0);
}

void fooHelper(int var) {
    if (var == 3) return;
    else fooHelper(var + 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;
}

因此,这种方法不需要添加帮助函数。

感谢您的输入,这也是我的想法,但我想知道是否有更优雅的解决方案。感谢您的输入,但变量不是控制深度,我需要它来匹配特定节点和xml结构。建议总是很好的。我不确定他的要求,所以我不确定它们是否合适,但它们都是值得注意的好东西+1.
void foo() {
    var_ = 0;
    foo_helper();
}

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