1
TD INFORMATIQUE N°2 PC* 15-16
Piles - Récursivité
1. Notation polonaise inverse
On souhaite réaliser un programme qui évalue des expressions arithmétiques écrites en notation polonaise
inverse (NPI). Dans cette notation les opérateurs arithmétiques (+,*,-,/) sont placés après leurs opérandes en
notation « post-fixée ».
Ainsi l’expression 2+3 s’écrit 2 3 + et l’expression 2+3*4 devient 2 3 4 * +. L’intérêt de cette notation est que
les parenthèses deviennent inutiles : par exemple l’expression (2+3)*4 s’écrit simplement 2 3 + 4 * (remarquer la
différence avec l’expression précédente).
On représentera l’expression en NPI par des listes contenant des réels et des chaines de caractères
(représentant les opérateurs). Par exemple, 6 2.18e5 + 3 * est représentée par la liste : [6, 2.18e5, '+', 3, '*'].
L’évaluation d’une expression en NPI nécessite une pile. L’idée consiste à parcourir la liste de gauche à droite
et à empiler chaque nombre rencontré. Lorsque l’élément courant est un opérateur, on dépile les deux
opérandes, on effectue le calcul et on empile le résultat.
a. Après avoir importé le module ClassePile (fichier ClassePile.pyc fourni, dont les méthodes et fonctions ont
été décrites en cours), écrire une fonction EvalueExpr(L) qui prend en paramètre la liste L définissant l’expression
en NPI et qui évalue et renvoie la valeur de l’expression.
Tester votre fonction avec le script principal suivant :
L=[1,5,'+',2,'+',-3,'*']
resultat=EvalueExpr(L)
print("Le résultat de l'expression représentée par :",L,"est :",resultat)
# On doit trouver -24
b. Modifier votre fonction EvalueExpr(L) pour ajouter les opérateurs unaires suivants :
'neg' opérateur qui prend l’opposé de son opérande
'abs' opérateur qui prend la valeur absolue
'inv' opérateur qui prend l’inverse
'²' opérateur qui prend le carré
Tester votre fonction avec le script principal et l’expression représentée par la liste suivante :
L=[1,5,'²','+',2,'+','neg',3,'inv','*','abs']
# On doit trouver 9.333...
2. Occurrences d’un caractère dans une chaine
Il s’agit dans cet exercice de compter le nombre de fois qu’apparait un caractère donné dans une chaine de
caractères.
a. Ecrire une fonction compte_iter(ch,c), où c contient un caractère et ch une chaine, qui compte le nombre de
fois qu’apparait c dans ch, selon un algorithme itératif.
b. Ecrire une fonction compte_rec(ch,c), où c contient un caractère et ch une chaine, qui compte le nombre de
fois qu’apparait c dans ch, selon un algorithme récursif.
Tester vos fonctions avec le script principal suivant :
L=["Si les végétaux s’appuyaient uniquement","sur le transport d’eau pour bouger, ils ne","pourraient pas
produire des mouvements","sur une échelle de temps plus petite que","celle donnée par le temps
poroélastique.","Pourtant, la figure 1 montre que de nombreuses","plantes franchissent largement cette","limite
hydrodynamique et rivalisent avec","les plus rapides mouvements rencontrés chez","le vivant. Comment font ces
champions","du règne végétal pour atteindre de telles","vitesses ? Nous allons voir que leur stratégie","commune
est d’utiliser une instabilité","mécanique, c’est-à-dire la libération rapide","d’énergie élastique au-delà d’un
certain seuil."]
c,i='e',0
for ch in L:
print(i, compte_iter(ch,c),compte_rec(ch,c))
i+=1