2009-08-22 24 views
5

Ho una funzione ricorsiva con una variabile statica "conteggio". La funzione incrementa il conteggio ricorsivo e poiché ha scope del file, quando chiamo una volta foo(), il conteggio è ancora uguale a 5. Esiste una tecnica per resettare il conteggio a 0 prima che venga chiamata la seconda volta foo()?Funzione ricorsiva con variabile statica

Fondamentalmente, non voglio contare di avere scope di file ma voglio che mantenga il suo valore attraverso diverse iterazioni.

Un modo in cui posso pensare di farlo è avere un argomento in foo() per inizializzare foo(). Come foo (int count). Ma c'è un altro modo?

#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

C'è un motivo particolare per cui si sta utilizzando un conteggio statico invece di passarlo come parametro? L'uso di variabili statiche in funzioni ricorsive come questa è generalmente considerato una cattiva idea, proprio a causa di cose come questa. –

+0

Nessun motivo particolare per la statica. Dalle risposte in basso, sono d'accordo sul fatto che un argomento sarebbe il modo migliore per farlo. – Steve

risposta

19

Un modo più idiomatico è quello di dividerlo in due funzioni:

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

che ha il vantaggio di non richiedere al chiamante di fornire un argomento per foo() ed inoltre non è necessario una variabile statica (che Mi sento sempre una cattiva idea).

+2

Questo è probabilmente il modo migliore per farlo. +1 A meno che non ci sia una strana ragione per cui ha bisogno di una variabile statica per questo ... –

+2

I valori di default degli argomenti sono lì così non devi fare una nuova funzione. Stiamo usando C++ qui. void foo (int count = 0) { – Potatoswatter

+4

Gli argomenti predefiniti dovrebbero valori di scelta predefiniti che si trovano essenzialmente sul lato del chiamante. L'argomento in questo caso, tuttavia, è un dettaglio di implementazione e dovrebbe essere nascosto dietro un'altra funzione.Non vuoi che il chiamante passi "100" come conteggio, vero? –

6

Metti nel resto

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

Se si desidera la ricorsione correttamente verificare la risposta di waxwing.

+0

Sembra il modo migliore. (+1) –

4

Invece di utilizzare una variabile statica, è sufficiente passare il conteggio come argomento.

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

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

Le variabili statiche e la ricorsione generalmente non vanno insieme.

0

È possibile modificare foo per accettare una variabile booleana che significa reimpostare o meno.

void foo() { 
    foo(false); 
} 

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

    if(b) { count = 0 }; 

    ... 
} 

call foo() come prima, o foo (true), se si desidera ripristinarlo.

0

È possibile effettuare la funzione di auto-reset in questo modo:

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

    cout<<++count<<endl; 

    foo(); 
} 

Più Siti codice standard.

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

ne dite di questo

count = (count+1)%5 
0

Non c'è bisogno di dichiarare due funzioni o utilizzare variabile statica. Potresti usare gli argomenti predefiniti.

// 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; 
} 
Problemi correlati