Vous êtes sur la page 1sur 6

Université Tunis El Manar

Institut Supérieur d’Informatique


ASD1 - L1CS
2020/2021

Correction TD 5 : Récursivité

Exercice 1 : Ecrire un programme qui demande un entier n positif et teste si ce nombre est
un multiple de 5 (sans utiliser les opérateurs /, mod, rem, ...).

Correction :
Algorithme : « Programme Principal »

Fonction Multiple_5(x :entier) : booleen


debut
si (x=0) alors Multiple_5 vrai
sinon si (x<5) alors Multiple_5  faux
sinon Multiple_5  Multiple_5(x-5)
finsi
finsi
fin
var n : entier
début « Programme Principal »
Répeter
Lire(n)
Jusqua (n>=0)
Si Multiple_5(n) alors écrire (n, «  est multiple de 5 »)
sinon écrire (n, «  n’est pas multiple de 5 »)
finsi
Fin « Programme Principal »

Exercice 2 : Soit la Suite de Fibonacci définit par :


u0=1
u1=1
un=un-1+un-2 pour n entier positif

Ecrire un programme qui demande un entier n positif (> 1) et affiche la valeur de un en


utilisant une fonction récursive pour le calcul de un.

Correction :
Fonction Fibonacci(n :entier) :entier
Debut
si (n=0) ou (n=1) alors Fibonacci 1
sinon Fibonacci  Fibonacci(n-1) + Fibonacci(n-2)
finsi
fin
Calculer le terme un de la suite de Fibonacci
Fibb(1)=1

à l'aide d'une fonction récursive Tracez Fibb(5).


Fibb(5)= Fibb (4)+ Fibb (3)
Fibb (4)= Fibb (3)+ Fibb (2)
Fibb (3)= Fibb (2)+ Fibb (1)
Fibb (2)= Fibb (1)+ Fibb (0)
Fibb (5)= Fibb (3)+ Fibb (2)+ Fibb (2)+ Fibb (1)
Fibb (5)= Fibb (2)+ Fibb (1)+ Fibb (1)+ Fibb (0)+ Fibb (1)+ Fibb (0)+ Fibb (1)
Fibb (5)= Fibb (1)+ Fibb (0)+1+1+1+1+1+1
Fibb (5)=8

Combien cet appel génère-t-il d'appels récursifs ? 8

Fibb(5)

Fibb(4) Fibb(3)

Fibb(2) Fibb(1)
Fibb(3) Fibb(2)

Fibb(2) Fibb(1) Fibb(1) Fibb(0) Fibb(1) Fibb(0)

Fibb(1) Fibb(0)

Combien au maximum y a-t-il d'appels imbriqués ? 15


Les appels récursifs ne se partagent pas     

   est incorrect.

2
Exercice 3 : Ecrire une fonction récursive ACKERMANN qui calcule A(a,b) selon le
principe suivant :
A(0,b) = b+1
A(a,0) = A(a-1,1)
A(a,b) = A(a-1, A(a,b-1))

Correction
Fonction ACKERMAN(a,b :entier) :entier

debut
si (a=0) alors ACKERMANb+1
sinon si (b=0) alors ACKERMAN ACKERMAN(a-1,1)
sinon ACKERMAN ACKERMAN(a-1, ACKERMAN(a,b-1))
finsi
finsi
fin

Exercice 4 :
a- Ecrire une fonction récursive de recherche simple d'un élément x dans un tableau
d'entiers de taille n non trié.

Correction :
Type TAB : tableau de [1..200] d’entiers
Fonction Recherche (Tab : tableau d’entier, n, x :entier) :booleen
Début
Si n=0

3
alors Recherche  faux
sinon
Si Tab[n]= x alors Recherchevrai
Sinon
Recherche Recherche(Tab, n-1,x)
Finsi
Finsi
Fin

b- Ecrire une fonction récursive de recherche dichotomique d'un élément x dans un


tableau d'entiers de taille n ordonné par ordre croissant.

Correction
Type TAB : tableau de [1..200] d’entiers
Fonction Rech_Dichot (T : TAB, Deb, Fin, x :entier) :booleen
Debut
mil(Fin+Deb) div 2
si Deb>Fin alors Rech_Dichotfaux
sinon
Si T[mil] = x alors Rech_Dichotvrai
Sinon
si (T[mil] < x)
alors Rech_Dichot Rech_Dichot (T,mil+1,Fin, x)
Sinon Rech_Dichot Rech_Dichot (T,Deb,mil-1, x)
Finsi
Finsi
Fin
Exercice 5: Écrire une fonction récursive appelée PGCD qui calcule le PGCD de 2 entiers a
et b par la méthode d'Euclide.
Exemple : PGCD(49,35) = PGCD(35,14) = PGCD(14,7) = 7

Correction :
Fonction PGCD(A,B :entier) :entier
Début
Si A=B alors PGCDA
sinon si A>B alors PGCD PGCD(A-B,B)
sinon PGCD PGCD(A,B-A)
finsi
finsi
Fin

Exercice 6: Écrire deux fonctions qui calculent, de façon récursive, la somme et le


produit de deux nombres entiers a et b positifs ou nuls.
Fonction somme(a,b :entier) :entier

Correction  :

4
Début
si a=0 alors sommeb
sinon
si b=0 alors sommea
sinon
si a>b alors somme1+somme(a,b-1)
sinon somme1+somme(a-1,b)
finsi
/* ce test permet d’accélérer l’éxécution en diminuant le nombre d’appels récursifs*/
finsi
finsi
fin

Fonction produit(a,b :entier) :entier
Début
si a=1 alors produitb
sinon si b=1 alors produita
sinon produita+produit(a,b-1)
finsi
fin
Exercice 7 :
a- Ecrire une procédure récursive qui permet d’afficher un tableau de caractères.

Correction :
Type : TAB : tableau de [1..100] d’entiers
Procédure Afficher (T : TAB ; i, n : entier)
Début
Si i<n alors
Ecrire (T[i])
Afficher (T,i+1,n)
Fin si
Fin
1ier appel appel récursif : Afficher (T ,1, n) :
Procédure Afficher2 (T : TAB ; n : entier)
Début
Si n>1 alors
Afficher (T,n-1)
Ecrire (T[n])
Fin si
Ecrire (T[n])
Fin
1ier appel appel récursif : Afficher (T ,1, n) :

b- Ecrire une procédure récursive qui permet d’afficher à l’inverse un tableau de


caractères.

5
Correction :
Procédure AfficherInverse (T : TAB ; i, n : entier)
Début
Si i<n alors
Afficher (T,i+1,n)
Ecrire (T[i])
Fin si
Ecrire (T[n])
Fin
1ier appel appel récursif : AfficherInverse (T ,1, n) 
Procédure AfficherInverse2 (T : TAB ; n : entier)
Début
Si n>1 alors
Ecrire (T[n])
Afficher (T,n-1)
Fin si
Ecrire (T[1])
Fin
1ier appel appel récursif : AfficherInverse (T , n) 

Exercice 8 :
Ecrire une fonction récursive qui retourne le maximum dans un tableau de n entier.

Correction  :
Type : TAB : tableau de [1..100] d’entiers
Fonction maximum_tab(T : TAB ; i, n : entier, var max_courant : entier) : entier
Début
Si i=n alors
Si T[n]>max_courant alors
max_courantT[i]
Finsi
maximum_tab max_courant
Sinon
Si T[i]>max_courant alors
max_courantT[i]
Finsi
maximum_tab maximum_tab(T,i+1,n, max_courant)
Fin si
Fin
1ier appel appel récursif : Mmaximum_tab(T ,2, n ,T[1]) :

Vous aimerez peut-être aussi