Vous êtes sur la page 1sur 2

Université de Franche-Comté MDI

TD d’évaluation de programme n◦ 5

Récursivité

Théorème de Cormen-Leiserson-Rivest (master theorem) :


Soit a ≥ 1 et b ≥ 1, soit f une fonction et soit C(n) définie pour n > n0 par la récurrence :

C(n) = aC(n/b) + f (n)

alors :
1. Si f (n) = O(nlogb a− ) pour constante  > 0, alors C(n) = Θ(nlogb a ).
2. Si f (n) = Θ(nlogb a ), alors C(n) = Θ(nlogb a log n).

Exercice 1 Fonction puissance.

On considère les deux méthodes suivantes pour calculer la puissance nième d’un nombre x :

float puissance1 (float x, int n){


if (n==0)
return(1);
else
return(x*puissance1(x,n-1));
}

float puissance2 (float x, int n){


float p;
if (n==0)
return(1);
else {
p=puissance2(x,n/2);
if(n%2 == 0)
return(p*p);
else
return(x*p*p);
}
}

1. Si n = 20, combien de multiplications effectue-t-on en appliquant la première méthode ?


Même question pour n = 200 et n = 2000.
2. Combien de multiplications effectue-t-on en appliquant la deuxième méthode avec n =
20, 200, 2000 ?
3. Analyser vos résultats. Quelle est la complexité de chaque méthode en termes de nombre
de multiplications ?

1
4. Laquelle est la meilleure ?
5. On modifie maintenant le programme puissance2 afin de minimiser le nombre de variables
utilisées, on obtient alors la fonction puissance3 suivante :
float puissance3 (float x, int n){
float p;
if (n==0)
return(1);
else {
if(n%2 == 0)
return(puissance3(x,n/2)*puissance3(x,n/2));
else
return(x*puissance3(x,n/2)*puissance3(x,n/2));
}
}
Comment cette modification affecte-t-elle la complexité de l’algorithme ainsi obtenu
ci-dessus ?

Exercice 2 Les tours de Hanoï

Le problème des tours de Hanoï est un grand classique illustrant l’usage de la récursivité. On a 3
piquets A, B et C et n disques 1, 2, ..., n. En position initiale, tous les disques sont sur le piquet
A, chaque disque reposant sur un disque de taille plus grande. À chaque étape, on a le droit de
déplacer le disque du haut d’un piquet pour le mettre sur un autre piquet, à condition qu’un
disque ne soit jamais posé sur un disque plus petit. Le but du jeu est de déplacer les n disques
du piquet A au piquet B.
1. Proposer une solution dans les cas n = 1, 2, 3, 4 (c’est-à-dire, identifier la succession de
déplacements à réaliser pour passer les n disques du piquet A au piquet B).
2. On voit se dessiner une approche récursive. Proposer un algorithme pour ce problème.
3. Analyser le nombre de mouvements de disques.

Vous aimerez peut-être aussi