2011-01-12 12 views
2

だから私は、グローバル変数var_で再帰関数を持っている場合:再帰関数のグローバル変数をゼロに保つには?

int var_; 

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

し、私がfooを(呼び出す関数を持っている)ので:

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

var_を設定するための最良の方法は何ですか= 0毎回fooはそれ自身の中からではなく呼ばれます。

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

が、私は再帰関数をたくさん使用していると私がfooを呼び出すと、後日var_ = 0を設定することを忘れたくない:私はちょうど行うことができます知っています。

誰もこれを解決する方法に関する提案はありますか?

おかげで、ジョシュ

答えて

6

ヘルパー関数に変わりfoo()

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

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

あなたは、既存のコードを変更する必要はありません、とあなたはまだちょうどfoo()を呼び出し、それがその作業をやらせることができます。からのみのfoo()メソッドを見えるように、あなたが得た最初の2つ(驚くほど似ている)の回答に追加するには

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

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

入力いただきありがとうございます。これも私が考えていたものですが、より洗練されたソリューションがあるのか​​疑問に思っていました。 – Grammin

3

私は初期化関数にfoo()を分割でしょう、そして真の再帰関数foo_helper()/ foo_recur()をプライベート(var_もプライベートである必要があります)にしておいてください。これがマルチスレッド環境で使用される場合は、foo()も同期させる必要があります。

また、 "グローバル"ではなくインスタンス変数またはクラス変数 "var_"を呼び出す方が良いです。

1

+0

常に良い提案。私は彼の要求を確信していないので、私は彼らが合っているかどうかはわかりませんが、彼らはすべて注意すべきことです。 +1 – Ktash

1

実際にこのグローバル変数が必要ですか?再帰の深さを制御するためにのみ使用されます場合は、次のように

、あなたは、よりエレガントな方法でそれを書き換えることができます。

void foo() { 
    fooHelper(0); 
} 

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

入力いただきありがとうございますが、varは深さを制御することではなく、特定のノードとxml構造を一致させる必要があります。 – Grammin

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; 
} 

この方法では、ヘルパー機能を追加する必要はありません。

関連する問題