(* Calcular a lista de todas as permutações de l. permutation [] = [[]] permutation [c] = [[c]] permutation [b;c] = [[b;c]; [c;b]] permutation [a;b;c] = [[a;b;c];[b;a;c];[b;c;a];[a;c;b]; [c;a;b]; [c;b;a]] logo: (das várias soluções, mostramos duas...) 1) permutation el::li = inserir el em todas as soluções de (permutation li) 2) el::li --> seja v = inserir el em li + inverter as soluções encontradas (ou seja v). Em resumo: v@(map rev v) excepto no caso em que |v|=1 (evita duplicados...) *) open List (* precisamos da função da alínea anterior *) let rec insertions e l = match l with [] -> [[e]] x::xs -> (e::l) :: (map (fun li -> x::li) (insertions e xs)) let rec permutations l = match l with [] -> [[]] (* primeira solução*) x::xs -> flatten (map (fun l -> (insertions x l)) (permutations xs)) (* segunda solução | x::xs -> let v = insertions x xs in if length v=1 then v else (v@(map rev v)) *)
This document was generated using caml2html