2016-06-24 7 views
4

Ich habe diese Funktion:Rekursion und Pre-Dekrementoperator

void m(int n) 
{ 
    if(n > 0) 
     m(--n); 
     cout << n << " "; //for n = 5 --> output is: 0 0 1 2 3 4 
} 

Ich habe ein Problem mit dem Verständnis, wie es funktioniert. Zum Beispiel:

n (Eingang) = 5

Ausgang:

Meine Frage ist: Warum es Null zweimal nicht zeigen?

Wenn ich Klammern wie folgt hinzu:

void m(int n) 
{ 
    if(n > 0) 
    { 
     m(--n); 
     cout << n << " "; // now, it shows 0 1 2 3 4 (n = 5) 
    } 
} 

Also, was Klammern in diesem Code führen, dass "0" nur einmal existiert?

Und wenn ich vordecrement (- n) zu nach-dekrement (n--) ändern zeigt es nichts. Warum?

Könnte mir jemand helfen zu verstehen, wie es funktioniert?

+0

Es klingt wie Sie müssen lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http: // ericlippert.com/2014/03/05/how-to-debug-small-programme /) ** – NathanOliver

+1

Fix Einrückung des ersten Schnipsel zum besseren Verständnis. – Jarod42

Antwort

7

Als erstes zu beachten ist: in C++, wenn Sie keine Klammern nach einer if-Anweisung setzen, wird nur die nächste Zeile in der Anweisung sein.

Beispiel:

if(x > 0) 
    cout << 1; 
    cout << 2; 

Hier cout << 2 immer, egal, den Wert von x ausgeführt werden

Der richtige Weg, dies zu schreiben, ist

if(x > 0) 
{ 
    cout << 1; 
    cout << 2; 
} 

Das Gleiche gilt für else Aussagen Also das war für die Klammern.

Meine wilde Vermutung für die Zeit nach Abnahme ist die folgende: wenn Sie m(n--) tun hat der Wert 5 sein wird, wird der Wert von n nur nach dem Funktionsaufruf und ausserhalb des Bereichs ändern (so hat es ist egal). Also, was passieren wird, ist eine unendliche Anzahl von m (5) Aufrufen und deshalb erscheint nichts. (Ich bin mir über diesen Teil nicht sicher, also sag mir bitte, wenn es falsch ist)!

Ich hoffe, es hat geholfen!

+1

Sie haben Recht, 'm (n-)' rufen Sie immer m (n) auf und nach Dekrement 'n' erscheint nichts, weil' cout' am Ende der Rekursion gemacht wird, aber die Rekursion nicht beendet wird . – chema989

+0

So sieht es aus: input: m (5) und m (n--) it menas: m (4) oder es wird nie "4" sein, weil es immer außerhalb des Geltungsbereichs ist, wenn die Eingabe "5" ist? – gryzek

4

Sieht aus, als ob Sie mit der Python-Syntax verwechselt wurden, wobei der Bereich if durch den Einzug bestimmt wird. In C (und C++, C#, Java und vielen anderen Sprachen) ist der Geltungsbereich eine Anweisung (die mit ; endet), wenn Sie die geschweiften Klammern { und } nicht verwenden. In der 1. Variante Ihres Codes wird cout << n << ... immer ausgeführt, unabhängig vom Wert n. In der zweiten Variante wird es nur durchgeführt if(n > 0)