所以如果我有一个带有全局变量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。
有没有人对如何解决这个问题有任何建议?
谢谢,乔希
答案 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;
}
所以这种方法不需要添加辅助函数。