(* Exercice 1 *)
(* ITERATION 1 *)
let eratosthene n =
let p = Array.make n true and premier = [] in
for k = 2 to n do (* on parcourt le tableau pour tester chaque entier pour voir s'il est premier *)
let i= ref 2 in
while !i<k do (* on avance dans le tableau jusqu'au prochain nombre premier *)
while p.(!i) = false do
incr i;
done;
if k mod !i = 0 then (* on regarde si le nombre est divisible par un nombre premier plus petit *)
p.(k) <- false;
incr i;
done;
if p.(k) = true then
premier <- premier@[k]; (* on ajoute le nombre au tableau s'il est premier *)
done;
premier;
(*
réponse de OCamL:
Characters 470-492:
premier <- premier@[k];
^^^^^^^^^^^^^^^^^^^^^^
Unbound instance variable premier
*)
eratosthene 100;
(* ITERATION 2 *)
(* Exercice 2 *)
(* N.B. Le programme a été testé sous OCaml *)
# let change a =
let b = Array.copy a and n = Array.length a in
b.(n-1) <- a.(n-2);
b.(n-2) <- a.(n-1);
b;;
val change : 'a array -> 'a array = <fun>
# change [| 1;2;3;4;5;6;7;8;9;10 |];;
- : int array = [|1; 2; 3; 4; 5; 6; 7; 8; 10; 9|]
(* Exercice 3 *)
let somme3 a =
let n = Array.length a and min = ref a.(0) in
for i = 0 to n-1 do
for j = i to n-1 do
let s = ref a.(i) in
for k = i+1 to j do
s:= !s + a.(k);
done;
if !s < !min then
min:= !s
done;
done;
!min;;
let somme2 a =
let n = Array.length a and min = ref a.(0) in
for i = 0 to n-1 do
let s = ref 0 in
for j = i to n-1 do
s:= !s + a.(j);
if !s < !min then min := !s;
done;
done;
!min;;
let rec iterer f n x = if n = 0 then x else iterer f (n-1) (f x);;
let somme2 a =
let n = Array.length a in
fst ( iterer ( fun (mini,i) ->
let (sf,minif,jf) = iterer ( fun (s,min,j) ->
let s' = s + a.(j) in
if s' < min then
(s',s',j+1)
else (s',min,j+1))
n-i+1
(0,mini,i) in
(minif,i+1))
n
(a.(0),0));;