• Aucun résultat trouvé

Structures de données et algorithmes

N/A
N/A
Protected

Academic year: 2022

Partager "Structures de données et algorithmes"

Copied!
14
0
0

Texte intégral

(1)

Structures de données et algorithmes

Chapitre 3

Simulation de la récursivité par

l’utilisation des piles

(2)

3 Implantation de la récursivité

l Comment les compilateurs implantent-ils la récursivité?

l Nous avons vu plusieurs exemples sur la récursivité dans le chapitre 1. En obéissant au principe de l’abstraction procédurale, nous avons insisté sur ce qu’est la récursivité, mais nous avons ignoré comment elle est implantée par le compilateur.

l Dans ce qui suit, nous allons présenter comment les piles sont utilisées pour implanter la récursivité.

(3)

3 Implantation de la récursivité

l En effet, à l’appel d’une fonction (récursive ou non), l’adresse de retour au programme appelant est sauvegardée. De cette façon, l’ordinateur va savoir où il doit enchaîner l’exécution du programme appelant après l’exécution complète de la fonction appelée.

l Aussi, un nombre d’informations concernant les variables locales du sous-programme appelé est sauvegardé. Ceci est pour éviter la

destruction de telles informations dans le cas où le programme est (directement ou indirectement) récursif.

l Il faut noter que le compilateur sauve l’information de n’importe quel sous-programme, qu’il soit récursif ou non.

l Cette information est référencée par “enregistrement d’activation”.

(4)

3 Implantation de la récursivité

l

Chaque enregistrement d’activation inclut:

Une variable contenant l’adresse de retour au programme appelant.

Une variable adresse du résultat, si le sous-programme appelé est une fonction.

Pour chaque paramètre formel, une variable adresse du paramètre réel correspondant.

Pour chaque paramètre formel, une variable contenant la valeur du paramètre réel correspondant.

Chaque variable déclarée dans le bloc du sous-programme.

(5)

3 Implantation de la récursivité

l Une partie de la mémoire principale est allouée pour une pile d’exécution dans laquelle :

un enregistrement d’activation est empilé quand un sous-programme est appelé.

un enregistrement d’activation est dépilé quand le sous-programme en exécution est fini.

l Durant l’exécution d’un sous-programme, l’enregistrement d’activation au sommet de la pile contient l’état courant du sous-programme.

(on l’appelle aussi contexte du sous-programme ou de la tâche).

(6)

3 Implantation de la récursivité

l Comme exemple simple, on suit la trace de l’exécution du programme DecToBin.

(Les adresses de retour sont notées RA1 et RA2).

void DecToBin()

/* Conversion du décimal au binaire */

{

int N;

scanf("%d", &N);

if (N < 0)

printf("erreur \n");

else

WriteBinary(N);

} /* RA1: Fin de DecToBin */

void WriteBinary(int N) {

if (N 1)

printf("%d", N);

else {

WriteBinary(N / 2);

printf("% d", N % 2);/* RA2 */

}

} /* Fin de WriteBinary */

(7)

3 Implantation de la récursivité

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

champs :

1.

Un pour l’adresse de retour

2.

Un pour la valeur du paramètre formel par valeur N.

(8)

3 Implantation de la récursivité

l

Prenons l’exemple où la valeur lue est 6.

Lorsque la fonction DecToBin appelle WriteBinary nous avons :

WriteBinary(6);

RA1 6

Adresse de retour

Paramètre formel N

(9)

3 Implantation de la récursivité

l

Suite à l’appel de WriteBinary.

Puisque N > 1, WriteBinary est appelée récursivement avec 3 (6 / 2) comme valeur du

paramètre actuel. Un deuxième enregistrement

d’activation est créé et empilé dans la pile.

WriteBinary(3);

RA1 6

Adresse de retour

Paramètre formel N

RA2 3

Adresse de retour

Paramètre formel N

(10)

3 Implantation de la récursivité

l

Suite à l’appel de WriteBinary.

Puisque N est encore > 1, WriteBinary est encore appelée cette fois-ci avec

N = 1 (3 /2), comme valeur du paramètre formel actuel. Un troisième enregistrement

d’activation est créé et empilé dans la pile.

WriteBinary(1);

RA1 6

Adresse de retour

Paramètre formel N

RA2 3

Adresse de retour

Paramètre formel N

RA2 1

Adresse de retour

Paramètre formel N

(11)

3 Implantation de la récursivité

l

Suite à l’appel de WriteBinary.

Puisque N 1, la valeur de N est imprimée et la sortie est: 1

Ceci complète la troisième activation de WriteBinary et alors la pile est dépilée et le retour est effectué à RA2. Le résultat de la pile est comme

suit: RA1

6

Adresse de retour

Paramètre formel N

RA2 3

Adresse de retour

Paramètre formel N

1

Affiché à l'écran

(12)

3 Implantation de la récursivité

l

Suite à l’appel de WriteBinary.

L’impression à l’adresse RA2 dans WriteBinary est exécutée et la valeur imprimée est 3 % 2

Encore une fois la pile est dépilée et un autre retour à RA2 est effectué, comme

montré ci-contre. RA1

6

Adresse de retour

Paramètre formel N

11

Affiché à l'écran

(13)

3 Implantation de la récursivité

l

Suite à l’appel de WriteBinary.

La sortie à partir de

l’instruction se trouvant à RA2 est 6 % 2

Ceci complète l’activation originale de WriteBinary. La pile est encore dépilée et devient vide et le retour se fait à RA1 à la fin de la procédure DecToBin().

110

Affiché à l'écran

(14)

3 Implantation de la récursivité

l La sortie finale est: 110 qui est l’équivalent en binaire du nombre décimal 6, la valeur d’entrée.

Vous devez retenir qu’à chaque appel d’une fonction, l’environnement local total est sauvegardé. En termes de langage de programmation, ceci peut être inefficace en temps et en espace si un large tableau est passé comme paramètre formel par valeur. Dans ce cas, une copie du tableau entier est empilée à chaque appel de la procédure

correspondante.

Dans tous les cas, il est intéressant d’implanter des solutions récursives quand les conditions sont appropriées. N’hésitez pas à utiliser les

solutions itératives quand celles-ci sont triviales et directes. Surtout, ne perdez pas de vue les critères de vérification et de maintenance, si

vous optez pour la solution itérative, ou pour la solution récursive.

Références

Documents relatifs

Pour éviter le parenthésage, il est possible de transformer une expression infixée en une expression postfixée en faisant &#34;glisser&#34; les opérateurs arithmétiques

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 :?.

– 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

– Après une recherche réussie, Position contient la position dans la liste de l’élément égal à Item (il peut avoir aussi plus d’un élément qui lui sont égaux)7. –