École de technologie supérieure
Département de génie de la production automatisée
GPA665
Structures de données et algorithmes Solutions du cahier d’exercices Série d’exercices no. 2 : La récursivité
Session : Automne 2002 Responsable du cours : Mohamed Cheriet, ing., Ph. D.
Locaux : Cours : 3740 Chargé de cours : Jean-Christophe Demers Laboratoire : 3324 Chargé de laboratoire : Nicolas Morency
Exercice 1
Fonction récursive affichant un nombre décimal positif dans l’ordre inverse. Un nombre entier est utilisé.
void PrintBackwardIntNumber(int N) {
if (N > 0) {
printf("%d", N%10);
PrintBackwardIntNumber(N/10);
} }
Exercice 2
Discussion sur les quatre concepts clés vus dans le cours sont :
1. Comment peut-on définir un problème en terme de sous-problème de même nature? L’approche utilisée par la fonction présentée consiste à cumuler le dernier élément du tableau. Ensuite on reprend le même problème en considérant seulement les n - 1 premiers éléments du tableau.
2. Comment faire chaque appel récursif pour diminuer la taille du problème? À chaque appel récursif le problème est diminué puisqu’à chaque appel la taille du tableau est réduite. De cette façon, la taille du problème est diminuée puisqu’on considère toujours le dernier élément du tableau.
3. *Quel instant du problème peut servir à un cas limite? Ici le cas limite se présente lorsque la taille du tableau est zéro.
4. Comme la taille du problème diminue, peut-on atteindre le cas limite? Le cas limite ne peut être évité ici car la fonction est simple et linéaire : à chaque appel récursif, le problème est immanquablement diminué jusqu’à ce que le tableau soit de dimension zéro.
*Il y a une coquille dans l’énoncé.
La condition d’arrêt n’est pas if(n < 0) mais poutôt : if(n <= 0)
Exercice 3
Sortie du programme :
entrée a = 1 b = 7 entrée a = 1 b = 3 sortie: a = 1 b = 3 sortie: a = 1 b = 7
Exercice 4
Sortie du programme avec l’appel de fonction suivant R(5, 3);.
6 2 7 1 8 0 8 0 7 1 6 2
En modifiant la fonction de façon à considérer x comme étant passé par adresse au lieu de par valeur, le programme devient alors :
void R(int *x, int y) {
if (y > 0) { (*x)++; y--;
printf("%d %d\n", *x, y);
R(x, y);
printf("%d %d\n", *x, y);
} }
La sortie de cette deuxième version est maintenant : (avec l’appel de fonction int x = 5; R(&x, 3);)
6 2 7 1 8 0 8 0 8 1 8 2
Exercice 5
Fonction récursive qui écrit un nombre décimal en valeur binaire.
void WriteBinary(int n) {
if (n <= 1) {
printf("%d", n);
} else {
WriteBinary(n / 2);
printf("%d", n % 2);
} }
Exercice 6
La réponse est dans la question! Le cas limite indiqué (si le tableau est de taille 1) est insuffisant puisqu’on ne vérifie pas à chaque itération si l’élément milieu est l’élément recherché. De plus, l’utilisation de variables indiquant les indexes de début et de fin de la partie du tableau qui est fouillé (first et last), permet de définir un cas limite général (c’est-à-dire lorsque first > last).