Les Arbres Binaires
d'Expressions (2)
Programmation Fonctionnelle I, 2009-2010
L1 Info&Math - Faculté des Sciences de Nice
http://deptinfo.unice.fr/~roy
Cours n°11
Parcours Itératif
Calcul Formel
Le type abstrait PILE
Les piles forment un type de
donnée fonctionnant en ordre
LIFO [Last In, First Out].
empiler dépiler
sommet
Nos piles seront fonctionnelles.
(pile-vide) ; constructeur de pile vide
(pile-vide? P) ; Pile Boolean
(empiler x P) ; Elément × Pile Pile*
(depiler P) ; Pile* Pile
(sommet P) ; Pile* Elément
Pile* dénote l'ensemble des piles non vides.
La fonction (empiler x P) ne
modifie pas la pile P, elle se
contente de calculer une
nouvelle pile ! Toutes les
opérations sont en O(1).
> (define P (empiler 3 (empiler 4 (empiler 5 (pile-vide)))))
> (sommet P)
3
> (sommet (depiler P))
4
> (sommet P)
3
3
4
5
L'implémentation du type abstrait passe ici aussi par les listes, qui
sont bien pratiques !
N.B. Les fichiers adt-arbre.scm
et adt-pile.scm sont rédigés
sous la forme de modules [hors-
programme], avec une syntaxe
un peu particulière...
(define (pile-vide? pile)
(empty? pile))
Pile Boolean
(define (empiler x pile)
(cons x pile))
Elément × Pile Pile*
(define (depiler pile)
(if (empty? pile)
(error 'depiler "Pile vide !")
(rest pile)))
Pile* Pile
(define (sommet pile)
(if (empty? pile)
(error 'sommet "Pile vide !")
(first pile)))
Pile* Elément
(define (pile-vide)
empty)
Boolean
A quoi sert une PILE ?
En électricité, à fournir de l'énergie. En cuisine, à stoker des
assiettes. En programmation, à stocker des résultats intermédiaires
qu'il faudra utiliser plus tard !
Par exemple, pour exécuter une récurrence enveloppée, une pile
implicite [non visible au programmeur] est utilisée par le système.
(fac n) = (* (fac (- n 1)) n)
Pour calculer n! , je calcule (n-1)! mais auparavant je mets la
multiplication par n en attente dans une pile...
calculer 3! calculer 2! calculer 1! calculer 0!
* 3 * 3
* 2
* 3
* 2
* 1
1126
Les ordinateurs sont des machines à pile. Lorsqu'un logiciel fonctionne
sur votre machine, une pile invisible et silencieuse est utilisée...
Le programmeur lui-même peut avoir besoin de modéliser une pile dans
le programme qu'il rédige. Reprenons la calculette HP [cours 10 p. 14]
> (scheme->hp '(- (* 2 (+ 5 1)) (/ 4 2)))
(2 enter 5 enter 1 enter + * 4 enter 2 enter / -)
Nous savons traduire une expression Scheme [arbre] en une séquence
de touches pour HP. Maintenant nous aimerions jouer itérativement
cette séquence de touches ! Pour cela, il nous faut une pile explicite :
2 enter
22
5
2
5
1
5 enter 1 enter +
2
6
*
12
12
4
4 enter
12
4
22 enter
/
12
2
-
10
1 / 20 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !