98 lines
1.7 KiB
OCaml
98 lines
1.7 KiB
OCaml
(* Exercice 1 *)
|
|
let rec rev_h l acc = match l with
|
|
| [] -> acc
|
|
| a::q -> rev_h q (a::acc)
|
|
;;
|
|
let rec rev l = rev_h l [];;
|
|
|
|
let rec for_all f l = match l with
|
|
| [] -> true
|
|
| a::q -> f a && for_all f q
|
|
;;
|
|
|
|
let rec exists f l = match l with
|
|
| [] -> false
|
|
| a::q -> f a || exists f q
|
|
;;
|
|
|
|
let rec mem x l = match l with
|
|
| [] -> false
|
|
| a::q -> a=x || mem x q
|
|
;;
|
|
|
|
(* Exercice 2 *)
|
|
let rec map f l = match l with
|
|
| [] -> []
|
|
| a::q -> f a::map f q
|
|
;;
|
|
|
|
let rec iter f l = match l with
|
|
| [] -> ()
|
|
| a::q -> let () = f a in iter f q
|
|
;;
|
|
|
|
let rec filter f l = match l with
|
|
| [] -> []
|
|
| a::q ->
|
|
if f a then
|
|
a::filter f q
|
|
else
|
|
filter f q
|
|
;;
|
|
|
|
let rec fold_right f l acc = match l with
|
|
| [] -> acc
|
|
| a::q -> f a (fold_right f q acc)
|
|
;;
|
|
|
|
let rec fold_left f acc l = match l with
|
|
| [] -> acc
|
|
| a::q -> fold_left f (f acc a) q
|
|
;;
|
|
|
|
(* Exercice 3 *)
|
|
let rec print_list print l =
|
|
print_string "[";
|
|
List.iter (fun a -> print a; print_string ",") l;
|
|
print_string "]"
|
|
;;
|
|
|
|
(* Exercice 4 *)
|
|
let for_all f l = List.fold_left (fun acc a -> acc && f a) true l;;
|
|
|
|
let exists f l = List.fold_left (fun acc a -> acc || f a) false l;;
|
|
|
|
let mem x l = exists (fun a -> a=x);;
|
|
|
|
(* Exercice 5 *)
|
|
let fact n =
|
|
let rec l n =
|
|
if n > 0 then
|
|
n::l (n-1)
|
|
else []
|
|
in
|
|
List.fold_left (fun acc a -> acc * a) 1 (l n)
|
|
;;
|
|
|
|
(* Exercice 6 *)
|
|
let init n f = if n = 0 then [||] else
|
|
let res = Array.make n (f 0) in
|
|
for i = 1 to n do
|
|
res.(i) <- f i
|
|
done;
|
|
res
|
|
;;
|
|
|
|
let copy t = init (Array.length t) (fun i -> t.(i));;
|
|
|
|
let mem x t =
|
|
let b = ref false in
|
|
let i = ref 0 in
|
|
let n = Array.length t in
|
|
while !i < n && (not !b) do
|
|
b := t.(!i) = x;
|
|
i := !i+1;
|
|
done;
|
|
!b
|
|
;;
|