• Aucun résultat trouvé

Solutions du cahier d’exercices Structures de données et algorithmes GPA665

N/A
N/A
Protected

Academic year: 2022

Partager "Solutions du cahier d’exercices Structures de données et algorithmes GPA665"

Copied!
3
0
0

Texte intégral

(1)

É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);

} }

(2)

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

(3)

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).

Références

Documents relatifs

Le deuxième exemple parcours la nouvelle liste chaînée en utilisant habilement une variable static qui permet d’identifier le dernier noeud de la nouvelle liste pour chaque

Une méthode répond au critère de composabilité modulaire si elle favorise la production d’éléments de logiciels qui peuvent être combinés librement les uns avec les autres

- le programme se compose de plusieurs fichiers source et la variable doit être utilisée dans un autre fichier que celui dans lequel elle est définie. extern

- le programme se compose de plusieurs fichiers source et la variable doit être utilisée dans un autre fichier que celui dans lequel elle est définie. extern

l Même si vous pouvez écrire une solution itérative au problème, considérer la recherche dichotomique récursive du dictionnaire :?.

l La procédure WriteBinary possède le paramètre formel par valeur N comme la seule variable locale, cependant, chaque enregistrement d’activation doit avoir deux..

– Si T n’est pas vide et possède une hauteur h &gt; 0, alors T est un arbre binaire plein si les deux sous-arbres de la racine sont des arbres.. binaires pleins de hauteur h

– Si T n’est pas vide et possède une hauteur h &gt; 0, alors T est un arbre binaire plein si les deux sous-arbres de la racine sont des arbres binaires pleins de hauteur h - 1.. Si