(*
  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