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);
}
  1. AHet aantal recursies halveert en het resultaat wordt twee keer zo snel verkregen
  2. BDe functie wordt geïnlined en de recursie zelf wordt door een constante vervangen
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Welk verschil tussen een compiler en een interpreter is juist?
  2. Welke uitspraak over een uitvoeringsomgeving die JIT-compilatie gebruikt is juist?
  3. Welke uitspraak over de basisopzet van LLVM is juist?
  4. In welke situatie wordt de instelling zonder optimalisatie (zoals -O0) bij de optie voor het optimalisatieniveau van een compiler vaak gebruikt?
  5. Welke uitspraak over profielgestuurde optimalisatie (PGO) is juist?

Vergelijkingen bij dit onderwerp