Exercice — dans l'esprit des sujets du bac
- Écrire la fonction récursive
Fact(n)calculant .- Identifier le cas de base et le cas récursif.
- Donner la trace d'exécution de
Fact(4)(arbre d'appels et valeurs retournées).
- Écrire la fonction récursive
PGCD(a, b)basée sur l'algorithme d'Euclide ( si , sinon ). CalculerPGCD(48, 18)en donnant la trace. - Écrire la fonction récursive
Fib(n)calculant le n-ième terme de la suite de Fibonacci (, , ).- Donner la trace de
Fib(5). - Expliquer pourquoi la version récursive de Fibonacci est inefficace et proposer une amélioration.
- Donner la trace de
Voir la correction commentéeAprès avoir posé votre démarche
1. Factorielle récursive. Structure : cas de base + appel récursif.
TDOL : paramètre n (Type/Nature : entier ≥ 0) ; pas d'objet local obligatoire.
DEF FN Fact(n : entier) : entier
Début
Si n = 0 alors Retourner 1
Sinon Retourner n * Fact(n - 1)
Fin
Trace de Fact(4) :
- Fact(4) = 4 × Fact(3)
- Fact(3) = 3 × Fact(2)
- Fact(2) = 2 × Fact(1)
- Fact(1) = 1 × Fact(0) = 1 × 1 = 1
En remontant : On retourne 24.
2. PGCD récursif (Euclide). si , sinon .
DEF FN PGCD(a, b : entier) : entier
Début
Si b = 0 alors Retourner a
Sinon Retourner PGCD(b, a mod b)
Fin
Trace PGCD(48, 18) : (48,18)→(18,12)→(12,6)→(6,0). On retourne 6.
3. Fibonacci. , , .
DEF FN Fib(n : entier) : entier
Début
Si n < 2 alors Retourner n
Sinon Retourner Fib(n-1) + Fib(n-2)
Fin
Cas de base : n dans [0..1].
Trace de Fib(5). Fib(5) = Fib(4) + Fib(3) ; Fib(4) = Fib(3) + Fib(2) ; Fib(3) = Fib(2) + Fib(1) ; Fib(2) = Fib(1) + Fib(0) = 1 + 0 = 1. En remontant : Fib(3) = 1 + 1 = 2, Fib(4) = 2 + 1 = 3, Fib(5) = 3 + 2 = 5. L'arbre d'appels compte 15 nœuds : Fib(3) est calculé deux fois, Fib(2) trois fois, Fib(1) cinq fois.
Inefficacité et amélioration. Chaque appel en engendre deux, d'où un nombre d'appels qui croît comme lui-même : complexité exponentielle. Amélioration : version itérative à deux variables (a ← 0 ; b ← 1 ; Pour i de 2 à n : c ← a+b ; a ← b ; b ← c), en O(n), ou mémorisation des valeurs déjà calculées.
Équivalent Python (extrait).def fact(n):
if n == 0:
return 1
return n * fact(n - 1)
print(fact(4))