Académique Documents
Professionnel Documents
Culture Documents
Département d’Informatique
Faculté des Sciences, Université Ibn Zohr
Agadir
Filière: SMI4
Module: Algorithmes & Structures de données
Factorielle
Par exemple, la fonction factorielle peut être définie sous forme
récursive de la manière suivante:
si n=0 alors factorielle(n)=1 sinon factorielle(n)=n*factorielle(n-1)
Lorsque n ≥ 1, il y a récursivité car la définition de factorielle(n) fait
appel à factorielle(n-1).
Suite de Fibonacci
F (0) = 0
F (1) = 1
F (n) = F (n − 1) + F (n − 2), si n > 1
Factorielle
fonction fact(N:Naturel):Naturel Programme en langage C
debut long fact(int N)
si N=0 alors {
retourner 1
if (N==0)
return 1;
sinon
else
retourner N*fact(N-1) return N*fact(N-1);
finsi }
fin
Définition
Une définition de fonction f est récursive terminale quand tout appel récursif est de la forme
return f(...); La valeur retournée est directement la valeur obtenue par un appel récursif, sans
qu’il n’y ait aucune opération sur cette valeur.
somme(a,b)
function somme(a,b:Naturel):Naturel
debut
si b=0 alors
retourner a
sinon
retourner somme(a+1,b-1)
finsi
end
somme(4,2)=somme(5,1)=somme(6,0)=6
Pr. Mohamed EL ANSARI (FS-Agadir) La récursivité 5 / 15
Récursivité non terminale
Définition
L’appel récursif n’est pas la dernière instruction et/ou elle n’est pas isolée
(fait partie d’une expression).
somme(a,b)
function somme(a,b:Naturel):Naturel
debut
si b=0 alors
retourner a
sinon
retourner 1+somme(a,b-1)
finsi
end
somme(4,2)=1+somme(4,1)=1+1+somme(4,0)=1+1+4=6
Présentation
Les tours de hanoı̈ est un jeu solitaire dont l’objectif est de déplacer les disques qui se
trouvent sur une tour (par exemple ici la première tour, celle la plus à gauche) vers une
autre tour (par exemple la dernière, celle la plus à droite) en suivant les règles suivantes
:
on ne peut déplacer que le disque se trouvant au sommet d’une tour ;
on ne peut déplacer qu’un seul disque à la fois ;
un disque ne peut pas être posé sur un disque plus petit.
Opérations disponibles
procédure dépilerTour ( E/S t : TourDeHanoi , S d : Disque )
procédure empilerTour ( E/S t : TourDeHanoi , E d : Disque )
Objectif
procédure resoudreToursDeHanoi ( E nbDisquesADeplacer : Naturel ,
E/S source, destination, intermediaire : TourDeHanoi )
Fonction récursive
procédure resoudreToursDeHanoi ( E nbDisquesADeplacer : Naturel , E/S source,
destination, intermediaire : TourDeHanoi )
Déclaration d : Disque
debut
si nbDisquesADeplacer= 1 alors
depiler(source,d)
empiler(destination,d)
sinon
resoudreToursDeHanoi(nbDisquesADeplacer-1, source, intermediaire,
destination)
depiler(source,d)
empiler(destination,d)
resoudreToursDeHanoi(nbDisquesADeplacer-1, intermediaire,
destination, source)
finsi
fin
Suite récurrente
q
1+un
Soit u la suite définie par u0 = 0 et ∀n ∈ N, un+1 = 2 .
1 Écrire la fonction récursive qui renvoie la valeur de un .
2 Réécrire cette même fonction sous forme non récursive (forme dite
itérative).
Exponentiation rapide
Écrire la fonction récursive qui renvoie la valeur de x n avec la méthode
suivante :
Si n est pair alors on élève x n/2 au carré.
2
Sinon on calcule x ∗ x (n−1)/2
1 Dépassement de capacité
Tentative de stocker un nombre plus grand que ce que peut contenir le
type de votre variable.
Choisir un type approprié
Exemple, pour le calcul des factoriels: utiliser long au lieu de int.
2 Débordement de pile (stack overflow)
Appels récursifs sont placés dans la pile du programme.
La taille de pile est assez limitée et fixée tout au long du programme
Grande taille de données → débordement de la pile → sortie anormale
du programme.