(* Parcourir toutes les paires d'éléments adjacents d'une liste, la liste étant considérée comme circulaire, i.e., fold_pairs f v [x1;x2;...;xn] calcule f(f(...f(f(v,x1,x2),x2,x3)...,xn-1,xn),xn,x1) *) let fold_pairs f v = function | [] | [_] -> v | x1 :: l -> let acc, xn = List.fold_left (fun (acc, prev) x -> f acc prev x, x) (v, x1) l in f acc xn x1 (* - on traite de façon particulière le cas d'une liste à 0 ou 1 élément (auquel cas on ne fait rien) - sinon, on utilise un accumulateur qui contient la valeur calculée d'une part et le dernier élément rencontré d'autre part *)