Informations

Date limite 15/04/2026 23:00:00
Limite de soumission Pas de limite

Se connecter

Evaluate

Les fonctions serialize et unserialize ne sont pas disponibles et ne doivent pas être utilisées dans cette partie du projet.

Pour rappel, l'évaluation consiste à remplacer chaque occurrence d'une variable dans l'arbre par sa valeur (float). Pour cela, un dictionnaire var_values doit avoir pour clés toutes les variables présentes dans l'arbre et, pour chacune de ces clés, le dictionaire définit la valeur à laquelle assigner la variable correspondante. A chaque étape, les valeurs calculées sont arrondies si digits >= 0.

Un appel de cette fonction pour l'arbre t4 qui contiendrait les variables x et y est donc par exemple:

t4 = Tree('/', [Tree('x'), Tree('y')])
evaluate(t4, var_values={'x': 2.45, 'y': -3.33}, digits=2)

Trucs et astuces

  • Pensez d'abord aux cas de base.

  • Pour pouvoir évaluer la valeur en un noeud interne de l'arbre, il est indispensable de connaître déjà la valeur de ses enfants. Cette propriété est essentielle pour déterminer comment organiser la récursion.

  • L'évaluation d'un arbre peut générer une erreur si l'évaluation se fait en dehors du domaine de la fonction mathématique représentée par cet arbre. Par exemple :

    t5 = Tree('/', [Tree(1), Tree('x')])
    evaluate(t5, {'x': 0.0})
    
       ZeroDivisionError: float division by zero
    

    Il ne s'agit pas ici d'une erreur du programme. Simplement, la fonction représentée par l'arbre est \(\frac{1}{x}\) et cette fonction n'est pas définie si \(x = 0\) (en d'autres termes, 0 est en dehors du domaine de la fonction). Vous n'avez donc pas à vous soucier de ce genre d'erreur si votre programme genère une exception de ce genre lorsque l'évaluation est lancée en dehors du domaine de définition de la fonction mathématique représentée par l'arbre passé en premier argument à la fonction evaluate.

  • Il est utile d'importer le module math (ou certaines fonctions incluses dans ce module) pour pouvoir effectivement évaluer des fonctions mathématiques. Cela ne change pas le fait que votre fonction evaluate devra parcourir récursivement l'arbre passé en paramètre pour évaluer la valeur globale de cet arbre.


Veuillez soumettre le corps de la fonction suivante:

from typing import Dict

def evaluate(tree: Tree, var_values: Dict[str, float], digits: int = -1) -> float:
    """
        :pre: tree est un arbre syntaxique valide et non vide,
              var_values contient en clé toutes les variables présentes dans l'arbre
        :return: le résultat de l'évaluation de l'arbre
        :post: Les valeurs pour les variables sont prises dans var_values,
               var_values["x"] est donc la valeur (float) de la variable x.
               Toutes les valeurs numériques sont arrondies à 'digits' décimales,
               sauf si 'digits' est négatif (pas d'arrondi).
    """