(* Renversement d'une liste, en utilisant append *)

let rec append l1 l2 = match l1 with
  | []      -> l2
  | x :: r1 -> x :: append r1 l2

let rec rev = function
  | [] -> []
  | x :: l -> append (rev l) [x]

(* note : c'est évidemment très naïf et de complexité quadratique

   une bien meilleure solution consiste à écrire une fonction plus
   générale rev_append qui calcule directement (append (rev l) acc)
   pour deux listes acc et l, ainsi *)

let rec rev_append acc = function
  | []     -> acc
  | x :: l -> rev_append (x :: acc) l

(* et à l'appliquer ensuite avec la liste vide *)

let rev l =
  rev_append [] l

(* ce qu'on pouvait écrire directement comme *)

let rev l =
  List.fold_left (fun acc x -> x :: acc) [] l

This document was generated using caml2html