Recursive function with static variable

2019-03-29 08:23发布

I have a recursive function with a static variable "count". The function increments count recursively and since it has file scope, when I call foo() a second time, count is still equal to 5. Is there a technique to reset count to 0 before the second time foo() is called?

Basically, I don't want count to have file scope but I want it to retain its value through different iterations.

One way I can think of doing it is have an argument in foo() to initialize foo(). Such as foo(int count). But is there another way?

#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条回答
啃猪蹄的小仙女
2楼-- · 2019-03-29 08:47

No need to declare two function or use static variable. You could use default arguments.

// 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;
}
查看更多
兄弟一词,经得起流年.
3楼-- · 2019-03-29 08:48

Put it in the else

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

If you want to recursion properly check out waxwing's answer.

查看更多
贪生不怕死
4楼-- · 2019-03-29 08:48

You can change foo to accept a boolean variable which means reset or not.

void foo() {
  foo(false);
}

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

    if(b) { count = 0 };

    ...
}

call foo() as before, or foo(true), if you want to reset it.

查看更多
Root(大扎)
5楼-- · 2019-03-29 08:51

How about this

count = (count+1)%5
查看更多
够拽才男人
6楼-- · 2019-03-29 08:52

A more idiomatic way is to split it into two functions:

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

Which has the benefit of not requiring the caller to supply an argument to foo() and also you don't need a static variable (which I always feel is a bad idea).

查看更多
疯言疯语
7楼-- · 2019-03-29 08:54

You can make the function auto-resetting this way:

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

  cout<<++count<<endl;

  foo();
}

Saves boilerplate code.

查看更多
登录 后发表回答