2009-08-22 16 views
5

Tengo una función recursiva con una variable estática "conteo". La función incrementa el recuento de forma recursiva y dado que tiene alcance de archivo, cuando invoco foo() por segunda vez, el recuento sigue siendo igual a 5. ¿Existe alguna técnica para restablecer el recuento a 0 antes de la segunda vez que se llama a foo()?Función recursiva con la variable estática

Básicamente, no quiero que el recuento tenga un alcance de archivo, pero quiero que retenga su valor a través de diferentes iteraciones.

Una forma en que puedo pensar en hacerlo es tener un argumento en foo() para inicializar foo(). Tales como foo (recuento int). ¿Pero hay otra manera?

#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; 
} 
+1

¿Hay alguna razón en particular por la que esté utilizando un conteo estático en lugar de pasarlo como un parámetro? El uso de variables estáticas en funciones recursivas como esta es generalmente considerado una mala idea, precisamente por cosas como esta. –

+0

Sin motivo particular para la estática. De las respuestas a continuación, estoy de acuerdo en que un argumento sería la mejor manera de hacerlo. – Steve

Respuesta

19

Una forma más idiomática es dividirlo en dos funciones:

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

que tiene la ventaja de no requerir la persona que llama para suministrar un argumento para foo() y también que no es necesario una variable estática (que Siempre siento que es una mala idea).

+2

Esta es probablemente la mejor manera de hacerlo. +1 A menos que haya alguna razón extraña por la que necesite una variable estática para esto ... –

+2

Los valores predeterminados de los argumentos están ahí, por lo que no es necesario que realice una nueva función. Estamos usando C++ aquí. void foo (int count = 0) { – Potatoswatter

+4

Los argumentos predeterminados deben ser valores de elección predeterminados que esencialmente están del lado de la persona que llama. El argumento en este caso, sin embargo, es un detalle de implementación, y debe ocultarse detrás de otra función.No quiere que la persona que llama pase "100" como conteo, ¿verdad? –

6

ponerlo en el otro

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

Si desea recursividad correctamente echa un vistazo a la respuesta de ampelis.

+0

Esto suena como la mejor manera. (+1) –

4

En lugar de usar una variable estática, simplemente pase la cuenta como un argumento.

void foo(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

int main() { 
    foo(0); 
    foo(0); 
} 

Las variables estáticas y la recursividad generalmente no van juntas.

0

Puede cambiar foo para aceptar una variable booleana que significa restablecer o no.

void foo() { 
    foo(false); 
} 

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

    if(b) { count = 0 }; 

    ... 
} 

llame a foo() como antes, o foo (verdadero), si desea restablecerlo.

0

Usted puede hacer la función de reinicio automático de esta manera:

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

    cout<<++count<<endl; 

    foo(); 
} 

países código repetitivo.

0
void foo() { 
    ... 
    if (count > 0) count--; // you can decrease it at then end of foo() 
} 
1

¿Qué tal esto

count = (count+1)%5 
0

No hay necesidad de declarar dos o utilizar la función variable estática. Podría usar argumentos predeterminados.

// 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; 
} 
Cuestiones relacionadas