Compilers
Welk effect heeft het toepassen van tail call optimization op de laatste recursieve aanroep van de bovenstaande functie?
int fact(int n, int acc) {
if (n <= 1) return acc;
return fact(n - 1, acc * n);
}
- AHet aantal recursies halveert en het resultaat wordt twee keer zo snel verkregen
- BDe functie wordt geïnlined en de recursie zelf wordt door een constante vervangen
- CDe aanroep wordt door een sprong vervangen en de stack groeit niet, ook niet bij diepe recursie
Antwoord en toelichting tonen
Antwoord: C. De aanroep wordt door een sprong vervangen en de stack groeit niet, ook niet bij diepe recursie
De recursieve aanroep van deze functie is de laatste handeling en geeft het resultaat direct terug (tail call). Omdat na de aanroep niets meer te doen is, kan het stackframe van de huidige functie worden hergebruikt en kan de aanroep worden omgezet in het aanpassen van de argumenten en een sprong naar het begin van de functie. Daardoor werkt het als een lus, groeit de stack niet hoe diep de recursie ook is en is er geen gevaar voor overflow. Het aantal recursies verandert niet, en omdat n tijdens de uitvoering wordt bepaald, kan het niet door een constante worden vervangen.