Compilateurs
Quel effet produit l'optimisation des appels terminaux appliquée au dernier appel récursif de la fonction ci-dessus ?
int fact(int n, int acc) {
if (n <= 1) return acc;
return fact(n - 1, acc * n);
}
- ALe nombre de récursions est divisé par deux et le résultat est obtenu deux fois plus vite
- BLa fonction est développée en ligne et la récursion elle-même est remplacée par une constante
- CL'appel est remplacé par un branchement (saut), et la pile ne croît pas même pour une récursion profonde
Afficher la réponse et l'explication
Réponse : C. L'appel est remplacé par un branchement (saut), et la pile ne croît pas même pour une récursion profonde
L'appel récursif de cette fonction est le dernier traitement de la fonction et son résultat est renvoyé tel quel (appel terminal). Aucun traitement ne restant après l'appel, il peut être transformé en réutilisation du cadre de pile courant, avec réécriture des arguments et saut au début de la fonction. Le comportement devient celui d'une boucle : la pile ne croît pas quelle que soit la profondeur de récursion et il n'y a plus de risque de débordement. Le nombre de récursions ne change pas, et n étant déterminé à l'exécution, le résultat ne peut pas devenir une constante.