Introduction
On peut définir des fonctions récursives, on peut aussi définir des structures de données récursives ! Le premier tel exemple est la liste. Nous verrons ensuite les arbres.
La liste est l’équivalent récursif des tableaux. Une liste peut être vide. Ou bien être constituée d’un élément (la tête) et d’une liste des éléments suivants (la queue).
On peut imaginer une liste comme un serpent : si on lui coupe la tête, il reste la queue. Et la queue est elle-même un serpent.
Représentation graphique sur le blog de Philip Wadler
Exercices
taille ou longueur d’une liste
(* taille en caml *) let rec taille l = match l with | [] -> 0 | _::q -> 1 + (taille q) ;;Le filtrage recherche un motif qui pour une liste sera de la forme ou bien la liste vide, ou bien une tête suivie d’une queue. La fonction taille est définie de façon récursive puisqu’on la réappelle sur la queue de la liste.
estVide teste si la liste est vide
(* estVide en caml *) let estVide = function | [] -> true | _ -> false ;;estDansteste si un élément donné appartient à la liste.concatenemet deux listes bout à bout.renverserenvoie la liste à l’envers.Calculer la complexité des fonctions
concateneetrenverse.maximumrenvoie le plus grand élément d’une liste d’entiers.minimumrenvoie le plus grand élément d’une liste d’entiers.repeat n mrenvoie la liste composée denfois l’élémentm.# repeat 5 "ah";; - : string list = ["ah"; "ah"; "ah"; "ah"; "ah"]cycle n lrenvoie la liste composée denfois la listel.# cycle 4 ["a";"b"];; - : string list = ["a"; "b"; "a"; "b"; "a"; "b"; "a"; "b"]pairs nrenvoie la liste des n premiers nombres pairs.# let lp = pairs 10;; val lp : int list = [2; 4; 6; 8; 10; 12; 14; 16; 18; 20]take n lrenvoie la liste desnpremiers éléments del.# take 4 lp;; - : int list = [2; 4; 6; 8]drop n lrenvoie la liste des éléments delprivée desnpremiers.# drop 5 lp;; - : int list = [12; 14; 16; 18; 20]lastrenvoie le dernier élément d’une liste.# last lp;; - : int = 20initrenvoie la liste privée de son dernier élément.# init lp;; - : int list = [2; 4; 6; 8; 10; 12; 14; 16; 18]