2009-08-22 11 views
5

Mam funkcję rekursywną ze statyczną zmienną "count". Funkcja zwiększa liczbę rekursywnie, a ponieważ ma zasięg pliku, gdy wywołuję foo() po raz drugi, liczba jest wciąż równa 5. Czy istnieje technika resetowania zliczenia do zera przed drugim wywołaniem foo()?Funkcja rekursywna ze zmienną statyczną

Zasadniczo nie chcę, aby liczyć zakres pliku, ale chcę, aby zachować jego wartość poprzez różne iteracje.

Jeden sposób, w jaki mogę to zrobić, to mieć argument w foo(), aby zainicjować foo(). Takich jak foo (int count). Ale czy istnieje inny sposób?

#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

Czy istnieje szczególny powód, dla którego używasz statycznego licznika zamiast podawania go jako parametru? Używanie zmiennych statycznych w takich rekurencyjnych funkcjach jest ogólnie uważane za zły pomysł, właśnie z powodu takich rzeczy jak ta. –

+0

Bez szczególnego powodu dla statycznego. Z poniższych odpowiedzi zgadzam się, że najlepszym argumentem na ten temat byłaby argumentacja. – Steve

Odpowiedz

19

Bardziej idiomatyczne sposobem jest podzielić ją na dwie funkcje:

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

Który ma tę zaletę, że nie wymaga rozmówcę dostarczyć argumentów do foo() a także nie trzeba zmiennej statycznej (która Zawsze uważam to za zły pomysł).

+2

Jest to prawdopodobnie najlepszy sposób na zrobienie tego. +1 O ile nie jest jakiś dziwny powód, dla którego potrzebuje on statycznej zmiennej do tego ... –

+2

Domyślne wartości argumentów są dostępne, więc nie musisz tworzyć nowej funkcji. Używamy tutaj C++. void foo (int count = 0) { – Potatoswatter

+4

Domyślne argumenty powinny domyślnie wybierać wartości, które są po stronie dzwoniącego. Argument w tym przypadku jest jednak szczegółem implementacji i powinien być ukryty za inną funkcją.Nie chcesz, żeby dzwoniący przekazał "100" jako liczbę, czyż nie? –

6

umieścić go w inny

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

Jeśli chcesz rekursji prawidłowo sprawdzić odpowiedź jemiołucha użytkownika.

+0

To brzmi jak najlepszy sposób. (+1) –

4

Zamiast używać zmiennej statycznej, po prostu podaj liczbę jako argument.

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

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

Zmienne statyczne i rekurencja zwykle nie idą w parze.

0

Możesz zmienić wartość foo, aby zaakceptować zmienną binarną, co oznacza zresetowanie lub nie.

void foo() { 
    foo(false); 
} 

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

    if(b) { count = 0 }; 

    ... 
} 

zadzwoń do foo() jak wcześniej lub foo (true), jeśli chcesz je zresetować.

0

Można zrobić funkcja automatycznego zerowania w ten sposób:

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

    cout<<++count<<endl; 

    foo(); 
} 

Zapisuje kod szablonowe.

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

Jak o tym

count = (count+1)%5 
0

ma potrzeby deklarowania dwa lub wykorzystać funkcję zmiennej statycznej. Możesz użyć domyślnych argumentów.

// 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; 
} 
Powiązane problemy