2009-08-22 66 views
5

我有一个带有静态变量“count”的递归函数。该函数递归递增计数,因为它有文件范围,当我第二次调用foo()时,count仍然等于5.是否有一种技术在第二次调用foo()之前将count重置为0?具有静态变量的递归函数

基本上,我不希望计数有文件范围,但我希望它通过不同的迭代保留其价值。

我能想到的一种方法是在foo()中有一个参数来初始化foo()。如foo(int count)。但还有另一种方式吗?

#include <iostream> 

using namespace std; 

void foo() 
{ 
    static int count = 0; 

    if(count<5) 
    { 
     count++; 
     cout<<count<<endl; 
     foo(); 
    } 
    else 
    { 
     cout<<"count > 5"<<endl; 
    } 
} 

int main() 
{ 
    foo(); //increment count from 0 to 5 
    foo(); //count is already at 5 

    return 0; 
} 
+1

是否有一个特定的原因,你使用静态计数,而不是将它作为参数传递?在像这样的递归函数中使用静态变量通常被认为是一个坏主意,正是因为这样的事情。 – 2009-08-22 19:33:43

+0

静态无特殊原因。从下面的答案中,我会同意一个论点将是最好的方式去做这件事。 – Steve 2009-08-22 21:33:54

回答

19

更地道的方式是把它分成两个功能:

void foo() { 
    foo_recursive(0); 
} 

void foo_recursive(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo_recursive(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

尚未要求呼叫者提供一个参数来foo(),你也并不需要一个静态变量的好处(这我总觉得不好主意)。

+2

这可能是最好的方法。 +1除非有一些奇怪的原因,他需要一个静态变量... – 2009-08-22 19:37:34

+2

参数默认值是有的,所以你不必做一个新的函数。我们在这里使用C++。 void foo(int count = 0){ – Potatoswatter 2009-08-22 20:15:52

+4

默认参数应该是默认的选择值,它们基本上位于调用者的侧面。然而,这种情况下的论点是一个实现细节,应该隐藏在另一个函数的后面。你不希望调用者通过“100”作为计数,是吗? – 2009-08-22 20:23:47

6

把它放在别的

else 
{ 
    cout<<"count > 5"<<endl; 
    count = 0; 
} 

如果你想递归正确检查出连雀的答案。

+0

这听起来像是最好的方法。 (+1) – 2009-08-22 19:43:56

4

而不是使用静态变量,只需将count作为参数。

void foo(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

int main() { 
    foo(0); 
    foo(0); 
} 

静态变量和递归通常不会在一起。

0

您可以将foo更改为接受布尔变量,这意味着重置与否。

void foo() { 
    foo(false); 
} 

void foo(int b) 
{ 
    static int count = 0; 

    if(b) { count = 0 }; 

    ... 
} 

如前所述,调用foo()或foo(true),如果您想重置它。

0

您可以进行功能的自动复位是这样的:

void foo() { 
    if (count >= 5) { 
    cout<<"count >= 5"<<endl; 
    count = 0; 
    return; 
    } 

    cout<<++count<<endl; 

    foo(); 
} 

保存样板代码。

0
void foo() { 
    ... 
    if (count > 0) count--; // you can decrease it at then end of foo() 
} 
1

这个怎么样

count = (count+1)%5 
0

无需申报有两项功能或使用静态变量。你可以使用默认参数。

// Use Default arguments 
void foo(int count = 0); 

void foo(int count) 
{ 
    if(count<5) 
    { 
     count++; 
     cout<<count<<endl; 
     foo(count); 
    } 
    else 
    { 
     cout<<"count > 5"<<endl; 
    } 
} 

int main() 
{ 
    foo(); // by default argument =0 
    foo(); // by default argument =0 

    return 0; 
}