Рекурсивная функция со статической переменной - PullRequest
5 голосов
/ 22 августа 2009

У меня есть рекурсивная функция со статической переменной count. Функция рекурсивно увеличивает счетчик, и, поскольку он имеет область видимости файла, когда я вызываю foo () второй раз, счетчик по-прежнему равен 5. Есть ли метод, позволяющий сбросить счетчик до 0 до второго вызова foo ()? *

По сути, я не хочу, чтобы 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;
}

Ответы [ 8 ]

19 голосов
/ 22 августа 2009

Более идиоматический способ - разделить его на две функции:

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(), а также вам не нужна статическая переменная (что я всегда считаю плохой идеей).

6 голосов
/ 22 августа 2009

Поместите это в остальное

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

Если вы хотите рекурсии правильно, проверьте ответ Wingwing.

4 голосов
/ 22 августа 2009

Вместо использования статической переменной просто передайте 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);
}

Статические переменные и рекурсия обычно не сочетаются друг с другом.

1 голос
/ 22 августа 2009

Как насчет этого

count = (count+1)%5
0 голосов
/ 23 августа 2009

Нет необходимости объявлять две функции или использовать статическую переменную. Вы можете использовать аргументы по умолчанию.

// 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;
}
0 голосов
/ 22 августа 2009
void foo() {
  ...
  if (count > 0) count--; // you can decrease it at then end of foo()
}
0 голосов
/ 22 августа 2009

Вы можете сделать функцию автосброса следующим образом:

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

  cout<<++count<<endl;

  foo();
}

Сохраняет стандартный код.

0 голосов
/ 22 августа 2009

Вы можете изменить foo для принятия логической переменной, которая означает сброс или нет.

void foo() {
  foo(false);
}

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

    if(b) { count = 0 };

    ...
}

вызовите foo () как раньше или foo (true), если вы хотите сбросить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...