我有一个带有静态变量“count”的递归函数。函数递增递增计数,因为它有文件范围,当我第二次调用foo()时,count仍然等于5.是否有一种技术在第二次调用foo()之前将count重置为0?
基本上,我不希望count有文件范围,但我希望它通过不同的迭代来保留它的值。
我能想到的一种方法是在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;
}
答案 0 :(得分: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()
提供参数,而且你也不需要静态变量(我总觉得这是一个坏主意)。
答案 1 :(得分:6)
把它放在其他地方
else
{
cout<<"count > 5"<<endl;
count = 0;
}
如果你想正确递归,请查看waxwing的答案。
答案 2 :(得分: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);
}
静态变量和递归通常不会一起出现。
答案 3 :(得分:1)
这个怎么样
count = (count+1)%5
答案 4 :(得分:0)
您可以更改foo以接受布尔变量,这意味着是否重置。
void foo() {
foo(false);
}
void foo(int b)
{
static int count = 0;
if(b) { count = 0 };
...
}
如前所述调用foo(),如果要重置,则调用foo(true)。
答案 5 :(得分:0)
您可以通过这种方式自动重置功能:
void foo () {
if (count >= 5) {
cout<<"count >= 5"<<endl;
count = 0;
return;
}
cout<<++count<<endl;
foo();
}
保存样板代码。
答案 6 :(得分:0)
void foo() {
...
if (count > 0) count--; // you can decrease it at then end of foo()
}
答案 7 :(得分: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;
}