2011-01-12 92 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()並讓它做其工作。

+0

感謝您的意見,這也是我的想法,但我想知道是否有更優雅的解決方案。 – Grammin 2011-01-12 17:57:40

3

我會分裂foo()到初始化函數,而真正的遞歸函數:

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

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

要添加到前兩個(驚人相似的),你有答案,使只有把foo()方法可見並且將foo_helper()/ foo_recur()保留爲私有(var_也應該是私有的)。如果這意味着要在多線程環境中使用,則還應該使foo()同步。

此外,最好調用「var_」實例或類變量(而不是「全局」)。

+0

總是很好的建議。我不確定他的要求,所以我不確定他們是否合適,但他們都是好的事情要注意。 +1 – Ktash 2011-01-12 18:02:31

1

你確實需要這個全局變量嗎?

如果它只是用來控制遞歸的深度,你可以重寫它以更優雅的方式,具體如下:

void foo() { 
    fooHelper(0); 
} 

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

謝謝你的輸入,但var不是關於控制深度,我需要它來匹配特定的節點和xml結構。 – Grammin 2011-01-12 17:59:42

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

所以這種方法不需要添加輔助函數。