Exercices à préparer pour le TD4. Thème structures de données.
L'utilisation de listes dans une analyse récursive [ E | Q ] mène naturellement à la notion de pile, le dernier élément mis dans une liste sera le premier que l'on enlèvera (LIFO).
Avec 2 listes, on peut retrouver la notion de file (une liste pour la tête, une liste pour la queue ; ex : T=[1, 2, 3 | Q ] et Q). Quand on veut ajouter un élément dans la file, il faut l'ajouter en queue. Par exemple, si on ajoute 4 à la liste précédente, on a Q = [4|Q'], et la nouvelle queue de liste est Q'. Si on veut retirer un éléments de la file, il faut le prendre à la tête. Dans l'exemple, on retire l'élément 1, et la nouvelle tête commence à 2. Avec deux listes, dans la même situation, on parle aussi parfois, de différence de listes : les éléments à considérer sont ceux obtenus par différence T - Q. C'est assez proche de la notion de liste avec pointeur de queue en algorithmique classique.
En imbriquant les listes, on peut obtenir des listes d'association, des dictionnaires, ou des arbres. Les listes d'association et dictionnaires peuvent être de simples listes de couples [Entrée,Valeur] (liste triée pour les dictionnaires), les arbres peuvent être des arbres binaires constitués d'une valeur et de deux sous-arbres, ex : [racine,[gauche,[],[]],[droite,[],[]] pour un arbre avec 3 noeuds. À noter, l'adéquation entre récursivité et arbres : autant les listes sont facilement gérées avec des boucles en algorithmique classique (les deux "objets" sont "linéaires"), autant les arbres et les boucles peuvent avoir du mal à coexister. Comme les arbres sont essentiels pour pouvoir améliorer l'efficacité de nombreux programmes, la récursivité devient elle aussi essentielle pour l'algorithmique classique.
Avec la résolution des contraintes on peut obtenir des listes circulaires, arbres infinis rationnels, des graphes, etc ...