dekrementiert Ich bin nur mit rekursiven Funktionen starten und wissen eine einige, wie C++ funktioniert, aber ich verstehe wirklich nicht, wie dieser Code funktioniert:(C++) rekursive Funktion - weiß nicht, warum diese
void q9_draw_triangle(int a, int b) {
// a is the starting point, b is the end
if (a > b) return;
// print pattern first
for(int i = 0; i < a; i++){
std::cout << "-";
}
std::cout << std::endl;
// call on triangle where a is incremented once
q9_draw_triangle(a+1,b);
// print pattern last
for(int i = 0; i < a; i++){
std::cout << "-";
}
std::cout << std::endl;
}
Ich bekomme, wie die obere Hälfte funktioniert, von q9_draw_triangle (a + 1, b) und höher, aber nicht die letzte für die Schleife. Als ich mit Hilfe eines Debuggers diesen Code durchging, sprang er nach dem Auftreten von a> b zur letzten schließenden Klammer, dann zur letzten for-Schleife und zeichnete dann die zweite Hälfte des Dreiecks und dekrementierte sich wieder auf den Anfangswert . Ich habe keine Ahnung, warum das passiert ist oder wie man dies zu dekrementieren wusste.
EDIT: Nur für den Fall, dass weitere Klärung erforderlich ist, sagen meine Eingaben waren a = 3 und b = 7. Der erste Teil von q9_draw_triangle (a + 1, b) und oben würde 3 Linien zeichnen, dann 4,5, 6,7. Dann geht es zur letzten schließenden Klammer und dann zur letzten Schleife und zieht 7; zurück zur letzten schließenden Klammer, zurück zur for-Schleife und ziehe 6, dann wiederhole für 5,4,3. Warum macht es das? Es geht nie wieder über die letzte for-Schleife hinaus und dekrementiert sich selbst, und das verstehe ich nicht. Wenn es dann zu a = 3 kommt, tritt es schließlich aus der Funktion heraus, woher weiß es das zu tun?
Jede Hilfe zum Verständnis wird geschätzt!
Ich würde vorsichtig sein, was hier im Debugger passiert, vor allem, wenn die Optimierung eingeschaltet ist. Moderne Compiler können Code erheblich neu anordnen und es kann ein gutes Stück Nachdenken erfordern, um zu rekonstruieren, was selbst erfahrenen Programmierern passiert. Wenn Sie die Optimierung aktiviert haben, versuchen Sie, sie auszuschalten, aber für diesen Fall würde ich mit einer zusätzlichen Ausgabe beginnen, um den Anruf anzuzeigen und die Grenzen zurückzugeben.Sie können sich das Dekrement vorstellen, das durch die Rückkehr von 'q9_draw_triangle (a + 1, b)' entsteht, wobei die vorherige Bindung von a wiederhergestellt wird, was dem Subtrahieren von 1 von der Bindung des inneren Aufrufs entspricht. –
Was meinst du mit "das dekrementiert"? – melpomene