# Monde des listes récursives

Ce monde vous permettra d'expérimenter avec les listes récursives, telles qu'elles ont été définies en Lisp à l'origine. Ce monde est assez similaire au BatWorld, mais vous êtes supposé écrire des fonctions récursives agissant sur des [!python|java]listes récursives. Comme [!thelang] ne propose rien de tel en natif, ce monde défini un nouveau type nommé `RecList` pour cela.[/!] [!scala]listes d'entiers (`List[Int]`).[/!]

Une telle liste peut être soit la liste vide (notée `[!scala]Nil[/!][!java]null[/!][!python]None[/!]`), soit un entier suivi d'une liste. Si une liste n'est pas vide, vous pouvez retrouver son premier entier avec `list.head`. On dit qu'on extrait alors la tête de la liste.La liste contenant ses autres éléments (tous sauf la tête) peut être retrouvée avec `list.tail`. On dit qu'on extrait la suite de la liste.Bien entendu, la liste vide n'a ni tête ni suite, et vous ne devriez pas tenter d'accéder à ces éléments sous peine d'obtenir un message d'erreur (particulièrement déplaisant).

Pour construire votre propre liste, vous devez concaténer une tête et une suite comme suit : [!java|python]`cons(tête, suite)`[/!] [!scala]`tête::suite`. Il se trouve que `::` est un opérateur générique du langage Scala pour construire des listes.[/!]

En résumé, vous pouvez résoudre tous les exercices de cette leçon avec les constructions suivantes :

- La liste vide:

      [!java|c]null[/!][!scala]Nil[/!][!python]None[/!]

- Obtenir le premier élément de `l`

      l.head

- Obtenir la suite de la liste, privée de son premier élément:

      l.tail

- Construire une liste à partir d'une `valeur` et d'une `liste`: [!java|python]

      cons(valeur, liste)

  [/!] [!scala]

      valeur::liste

  [/!]