![](/img/trans.png)
[英]java - how to avoid global external variable as output in recursive function
[英]Global variable in a recursive function how to keep it at zero?
所以,如果我有一個帶有全局變量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。
有沒有人對如何解決這個問題有任何建議?
謝謝,喬希
將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_也應該是私有的)。 如果這是為了在多線程環境中使用,您還應該使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;
}
因此,這種方法不需要添加輔助函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.