tyrion

gruppo6.ml

Nov 9th, 2012
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 3.83 KB | None | 0 0
  1. let rec find p = function
  2.     | [] -> failwith("Proprietà non soddisfatta")
  3.     | x::xs -> if p x then x else find p xs
  4.    
  5. let takewhile p lst =
  6.     let rec aux taken = function
  7.         | [] -> taken
  8.         | x::xs -> if p x then aux (x::taken) xs else taken
  9.     in List.rev(aux [] lst)
  10.    
  11. let rec dropwhile p = function
  12.     | [] -> []
  13.     | x::xs -> if p x then dropwhile p xs else x::xs
  14.  
  15. let partition p lst =
  16.     let rec aux (yes,no) = function
  17.         | [] -> (yes,no)
  18.         | x::xs -> aux (if p x then (x::yes,no) else (yes,x::no)) xs
  19.     in aux ([],[]) (List.rev lst)
  20.    
  21. let pairwith y = List.map (fun x -> (y,x))
  22.  
  23. let rec matrice n = function
  24.     | [] -> false
  25.     | xs::ys -> (List.for_all (fun x -> x < n) xs) || matrice n ys
  26.  
  27. find (fun x -> x*x < 30) [6; 7; 9; 10; 5; 8; 2]
  28.  
  29. let setdiff xs ys = List.filter ( fun x -> not (List.mem x ys) ) xs
  30.  
  31. let subset xs = List.for_all (fun x -> List.mem x xs)
  32.  
  33. let duplica = List.map (fun x -> (x,x))
  34.  
  35. let intesta x = List.map (fun (y,xs) -> (y,x::xs))
  36.  
  37. let rec aux n x y lista =
  38.     if n == 3 then lista else aux (n+1) y x (x::lista)
  39. in aux 0 0 1 []
  40.  
  41. (*
  42.  * 1) x for x in [0,1]
  43.  * 2) ((x::y for y in [0,1]) for x in [0,1])
  44.  *
  45.  * values=(A,B)
  46.  * res=[(A,A), (A,B), (B,A), (B,B)]
  47.  *)
  48.  
  49. (* O(n) tail-recursive *)
  50. let rev list =
  51.     let rec aux res = function
  52.         | [] -> res
  53.         | x::xs -> aux (x::res) xs
  54.     in aux [] list
  55.  
  56. (* O(2a) tail-recursive *)
  57. let append a b =
  58.     let rec aux res = function
  59.         | [] -> res
  60.         | x::xs -> aux (x::res) xs
  61.     in aux b (rev a)
  62.    
  63. let product repeat values =
  64.     let rec step lista n =
  65.         let rec aux res = function
  66.             | [] -> res
  67.             | x::xs -> aux (res @ (List.map (fun y -> x::y) lista)) xs
  68.         in if n < repeat then step (aux [] values) (n+1) else lista
  69.     in step [[]] 0
  70.  
  71. let interleave x lst =
  72.     let rec aux res xs =
  73.         (* @ : 'a list -> 'a list -> 'a list
  74.          * funzione di supporto che concatena due liste invertendo la prima
  75.          * [1; 2] @ [3; 4] => [2; 1] @ [3; 4] *)
  76.         let rec (@) xs ys = match xs with
  77.             | [] -> ys
  78.             | x::xs -> xs @ (x::ys)
  79.         in function
  80.             | [] -> (xs@[x])::res
  81.             | y::ys -> aux ((xs@x::y::ys)::res) (y::xs) ys
  82.     in aux [] [] lst
  83.  
  84.  
  85. (* Calcola le permutazioni di una lista non vuota. La lista con un solo
  86.  * elemento è considerata un caso base. *)
  87. let rec permut lst =
  88.     (* Data una lista xs @ y::ys calcola le permutazioni della lista composta da
  89.      * tutti gli elementi tranne y con (permut (xs@ys)) e aggiunge y in testa ad
  90.      * ogni permutazione. Poi si mette y in xs e si prende come nuovo y il primo
  91.      * elemento di ys. Si continua finché ys non è vuota. *)
  92.     let rec aux res xs = function
  93.         | [] -> res
  94.         | y::ys ->
  95.             aux ((List.map (fun zs -> y::zs) (permut (xs@ys)))@res) (y::xs) ys
  96.     in match lst with
  97.         | [] -> (failwith "permutation of an empty list")
  98.         | [x] -> [[x]]
  99.         | _ -> aux [] [] lst
  100.  
  101.  
  102. let in_riga (dim, labirinto) i v =
  103.     List.exists (fun ((r,_),c) -> r = i && c = v) labirinto
  104.  
  105. let trova_colonna (dim, labirinto) i v =
  106.     snd (fst (List.find (fun ((r,_),c) -> r = i && c = v) labirinto))
  107.  
  108. let rec in_tutte (dim, lab) v =
  109.     if dim = 0 then true else
  110.         let i = dim-1 in in_riga (dim, lab) i v && in_tutte (i, lab) v
  111.  
  112. let find x lst =
  113.     let rec aux xs = function
  114.         | [] -> failwith "il valore 'x' non è presente nella lista"
  115.         | y::ys -> if y = x then ((List.rev xs),ys) else aux (y::xs) ys
  116.     in aux [] lst
  117.  
  118. let spezza x lst = find x (snd (find x lst))
  119.  
  120.  
  121. let prendi p lst =
  122.     let rec aux xs = function
  123.         | [] -> failwith "nessun elemento soddisfa la condizione"
  124.         | y::ys -> if p y then (y, xs@ys) else aux (y::xs) ys
  125.     in aux [] lst
Advertisement
Add Comment
Please, Sign In to add comment