Wie finde ich die Tiefe einer rekursiven Funktion in C ++?

8

Wie kann ich die aktuelle Tiefe innerhalb einer rekursiven Funktion in C ++ finden, ohne die vorherige Ebene zu übergeben? Ist es möglich zu wissen, wie oft die Funktion aufgerufen wurde, ohne einen Parameter zu verwenden, um den Pegel zu verfolgen und diese Zahl bei jedem Aufruf der Funktion als Parameter weiterzuleiten?

Zum Beispiel sieht meine rekursive Funktion so aus:

%Vor%     
Arizona1911 29.10.2010, 22:26
quelle

7 Antworten

11

Aufbauend auf der bereits gegebenen Antwort von JoshD :

%Vor%

Dies setzt den Zähler zurück, nachdem die rekursive Funktion abgeschlossen ist, verfolgt aber immer noch die maximale Tiefe der Rekursion.

Ich würde statische Variablen wie diese nur für einen schnellen Test verwenden, der bald darauf gelöscht wird. Wenn Sie dies kontinuierlich verfolgen müssen, gibt es bessere Methoden.

    
Mark Ransom 29.10.2010, 22:38
quelle
5

Sie könnten eine statische Variable in der Funktion ...

verwenden %Vor%

Natürlich wird dies weiter zählen, wenn Sie einen neuen Anruf starten ....

    
JoshD 29.10.2010 22:29
quelle
3

Sie können eine lokale statische Variable verwenden, wenn Sie sich nicht um die Thread-Sicherheit kümmern.

Dies wird Ihnen jedoch nur dann eine korrekte Zählung geben, wenn Sie Ihre rekursive Routine zum ersten Mal ausführen. Eine bessere Technik wäre eine RAII-Wächter-Klasse, die eine interne statische Variable enthält. Erstellen Sie am Anfang der rekursiven Routine die Schutzklasse. Der Konstruktor würde die interne statische Variable inkrementieren und der Destruktor würde sie dekrementieren. Auf diese Weise erhöht sich der Zähler beim Erstellen eines neuen Stapelrahmens um eins, und wenn Sie von jedem Stapelrahmen zurückkehren, wird der Zähler um eins dekrementiert.

%Vor%

Beachten Sie jedoch, dass dies immer noch nicht Thread-sicher ist. Wenn Sie Thread-Sicherheit benötigen, können Sie die Variable static-storage durch eine Variable Thread-local-storage ersetzen, indem Sie entweder boost::thread_specific_ptr oder die lokalen C ++ 0x-Thread-Funktionen verwenden.

    
Charles Salvia 29.10.2010 22:29
quelle
2

Wenn Sie möchten, dass es reentrant und threadsicher ist, warum nicht:

%Vor%

Keine statischen / globalen Variablen , um Threads zu verwirren, und Sie können verschiedene Variablen für verschiedene rekursive Ketten für Re-Entrance-Probleme verwenden.

    
Blindy 29.10.2010 22:46
quelle
1

Sie können die Ebene auch als Vorlageparameter übergeben, wenn sie zur Kompilierungszeit ermittelt werden kann. Sie könnten auch ein Funktionsobjekt verwenden. Dies ist bei weitem die beste Option - weniger Aufwand, und statische Variablen sollten möglichst vermieden werden.

%Vor%     
Puppy 29.10.2010 22:45
quelle
0

konvertiert level in eine Instanzvariable eines neuen Objekts (in der Regel eine Vorlage), die die Argumente und (möglicherweise) die Funktion enthalten kann. dann können Sie die Rekursion-Akkumulator-Schnittstelle wiederverwenden.

    
justin 29.10.2010 22:38
quelle
0

Sie können auch versuchen, eine globale Variable zu verwenden, um die Tiefe zu protokollieren.

%Vor%     
LostInTheCode 29.10.2010 22:38
quelle

Tags und Links