23 lines
812 B
OCaml
23 lines
812 B
OCaml
|
(*** Combinaisons d'une liste ***)
|
||
|
|
||
|
(* CONTRAT
|
||
|
Fonction qui génère des combinaisons
|
||
|
Paramètre k : nombre d'objets que l'on souhaite combiner
|
||
|
Paramètre l : liste dont l'ont souhaite les combinaisons
|
||
|
Résultat : l'ensemble des k combinaisons de l
|
||
|
*)
|
||
|
let rec combinaison k l =
|
||
|
match k,l with
|
||
|
| 0, _ -> [[]]
|
||
|
| _, [] -> []
|
||
|
| _, t::q ->
|
||
|
let liste1 = combinaison k q in
|
||
|
let liste2 = combinaison (k-1) q in
|
||
|
liste1@( List.map (fun x -> t::x) liste2 )
|
||
|
|
||
|
(* TESTS *)
|
||
|
let%test _ = combinaison 0 [1;2;3;4] = [[]]
|
||
|
let%test _ = combinaison 1 [1;2;3;4] = [[4]; [3]; [2]; [1]]
|
||
|
let%test _ = combinaison 2 [1;2;3;4] = [[3; 4]; [2; 4]; [2; 3]; [1; 4]; [1; 3]; [1; 2]]
|
||
|
let%test _ = combinaison 3 [1;2;3;4] = [[2; 3; 4]; [1; 3; 4]; [1; 2; 4]; [1; 2; 3]]
|
||
|
let%test _ = combinaison 4 [1;2;3;4] = [[1; 2; 3; 4]]
|