Compiler
Welche Wirkung hat es, wenn auf den letzten rekursiven Aufruf der obigen Funktion die Tail-Call-Optimierung angewendet wird?
int fact(int n, int acc) {
if (n <= 1) return acc;
return fact(n - 1, acc * n);
}
- ADie Zahl der Rekursionen halbiert sich, und das Ergebnis wird doppelt so schnell berechnet
- BDie Funktion wird inline eingesetzt, und die Rekursion selbst wird durch eine Konstante ersetzt
- CDer Aufruf wird durch einen Sprung ersetzt, und der Stack wächst auch bei tiefer Rekursion nicht
Antwort und Erläuterung anzeigen
Antwort: C. Der Aufruf wird durch einen Sprung ersetzt, und der Stack wächst auch bei tiefer Rekursion nicht
Der rekursive Aufruf dieser Funktion ist die letzte Operation der Funktion und gibt deren Ergebnis unverändert zurück (Tail Call). Da nach dem Aufruf nichts mehr zu tun bleibt, kann der Stack-Frame der aktuellen Funktion wiederverwendet werden, indem die Argumente überschrieben und an den Funktionsanfang gesprungen wird. Dadurch wirkt es wie eine Schleife, der Stack wächst auch bei beliebig tiefer Rekursion nicht, und ein Überlauf droht nicht. Die Zahl der Rekursionen ändert sich nicht, und da n erst zur Laufzeit feststeht, ist eine Konstante nicht möglich.