diff --git a/Structures_lineaires/Listes_chainees/README.md b/Structures_lineaires/Listes_chainees/README.md index be9ed5e..74ea5f8 100644 --- a/Structures_lineaires/Listes_chainees/README.md +++ b/Structures_lineaires/Listes_chainees/README.md @@ -41,6 +41,14 @@ m1 = Maillon("Bulbizarre", m2) Chaque Pokémon connait son évolution suivante - mais pas la précédente. C'est exactement le principe du maillon. +```mermaid +flowchart LR + A["Bulbizarre\n(valeur)"] -->|"suivant"| B["Herbizarre\n(valeur)"] + B -->|"suivant"| C["Florizarre\n(valeur)"] + C -->|"suivant"| N["None"] + style N fill:#eee,stroke:#aaa,color:#aaa +``` + --- ## 3. La classe ListeChainee @@ -129,17 +137,33 @@ def rechercher(self, valeur): ## 4. Structure récursive -Une liste chaînée est naturellement **récursive** : -- soit elle est **vide** +> **Analogie - les poupées russes.** Une matriochka contient soit *rien du tout*, soit *une poupée* et *une autre matriochka* à l'intérieur. Une liste chaînée, c'est exactement pareil : soit elle est vide, soit elle est un maillon qui contient une valeur... et une autre liste chaînée. + +Une liste chaînée est donc naturellement **récursive** : +- soit elle est **vide** (`None`) - soit elle est un **maillon** (tête) suivi d'une **liste chaînée** (queue) +```mermaid +flowchart LR + subgraph "Liste chaînée" + A["Bulbizarre"] --> subgraph2 + subgraph subgraph2["Liste chaînée"] + B["Herbizarre"] --> subgraph3 + subgraph subgraph3["Liste chaînée"] + C["Florizarre"] --> N["None\n(liste vide)"] + end + end + end + style N fill:#eee,stroke:#aaa,color:#aaa +``` + On peut écrire la longueur de manière récursive : ```python def longueur_rec(maillon): - if maillon is None: + if maillon is None: # liste vide : 0 poupée return 0 - return 1 + longueur_rec(maillon.suivant) + return 1 + longueur_rec(maillon.suivant) # 1 + longueur du reste ``` Cette vision récursive ("tête + queue") est la même qu'on retrouve dans les arbres (chapitre Arbres).