Взгляните на Nagios-сменный сценарий или check_postgres.pl
Более идиоматический способ - разделить его на две функции:
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 ()
, а также вам не нужна статическая переменная (что я всегда считаю плохой идеей).
Поместите это в else
else
{
cout<<"count > 5"<<endl;
count = 0;
}
Если вы хотите правильно выполнить рекурсию, посмотрите ответ свиристеля.
Вместо использования статической переменной просто передайте 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);
}
Статические переменные и рекурсия обычно несовместимы.
void foo() {
...
if (count > 0) count--; // you can decrease it at then end of foo()
}
Вы можете изменить foo, чтобы он принимал логическую переменную, которая означает сброс или нет.
void foo() {
foo(false);
}
void foo(int b)
{
static int count = 0;
if(b) { count = 0 };
...
}
вызовите foo (), как и раньше, или foo (true), если вы хотите сбросить его.
Вы можете выполнить автоматический сброс функции следующим образом:
void foo () {
if (count >= 5) {
cout<<"count >= 5"<<endl;
count = 0;
return;
}
cout<<++count<<endl;
foo();
}
Сохраняет шаблонный код.
Нет необходимости объявлять две функции или использовать статическую переменную. Вы можете использовать аргументы по умолчанию.
// 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;
}