具有静态变量的递归函数

时间:2009-08-22 19:28:10

标签: c++ static recursion

我有一个带有静态变量“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;
}

8 个答案:

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