TP6 : retour vers les arbres
Où l'on retrouve nos arbres, pour évaluer des expressions
Principe du TP
Nous allons maintenant revenir sur nos arbres, du TP4, afin de représenter les expressions RPN sous forme d’arbres.
Exercice 1, arbres simples
- Reprendre les arbres du TP4, mais ce coup-ci, ajouter sur les noeuds intérieurs un champ opérateur. Modifier le constructeur pour qu’il considère ce paramètre. Pour simplifier la suite.
- Écrire la fonction
evalsur la classe arbre modifiée, qui évalue l’expression (l’arbre vide renvoyantNone).
Exercice 2, les arbres en version POO
L’utilisation d’une variable “type”, et d’une seule classe pour tous les types d’arbre, est assez peu élégante. Dans un langage objet, on devrait utiliser l’héritage à la place. Nous allons donc créer quatre classes:
- une classe
TreeBase, qui contient des squelettes de fonctions, qui peuvent être virtuelles, comme :
def eval(self): raise NotImplementedError
- une classe
TreeEmpty, qui hérite deTreeBase, et implémente le comportement d’un arbre vide ; - une classe
TreeLeaf, qui hérite deTreeBase, et implémente le comportement d’une feuille ; - une classe
TreeNode, qui hérite deTreeBase, et implémente le comportement d’un noeud intérieur.
Pour simplifier, on pourra se limiter aux fonctions suivantes: eval, height et leafcount. Réimplémenter les autres fonctions est laissé en exercice.
Exercice 3, la classe Stack2Tree
Le but va être de construire une classe, qui se comporte comme une pile, mais qui au lieu d’effectuer les calculs, va créer un arbre représentant l’expression, lorsqu’on appelle ses méthodes “op_”.
- Créer une classe
Stack2Treequi hérite deStack. - Réimplémenter la méthode
pushpour mettre desTreeLeafau lieu des simples entiers dans la pile. - Réimplémenter la méthode
apply_oppour que, au lieu d’appliquer l’opérateur, on construise un arbre correspondant. - La fonction
rpndevrait, toute seule, créer des arbres, sans avoir à la modifier. - Écrire une fonction
evalqui appelleevalsur l’arbre contenu au sommet de la pile.
Exercice 4, ajout de l’aléatoire
- Ajouter un opérateur
randqui choisit un nombre aléatoire (1 6 randétant un dé classique,1 20 randun d20 de rôliste). - Écrire une méthode
simplifysur les arbres, qui va simplifier l’arbre, en transformant en feuille toutes les sous-expressions qui ne contiennent pas d’aléatoire. Par exemple, l’arbre de l’expression1 6 rand 2 3 + *devra être converti en l’arbre de l’expression1 6 rand 5 *.