(* Trouver le min et le max d'une liste *) let max_liste = function |[] -> failwith "Erreur" |t::q -> it_list max t q ;; let min_liste = function |[] -> failwith "Erreur" |t::q -> it_list min t q ;; let fend_tout liste= let rec fend tas petit grand=match tas with |[]->(petit,grand) |[a]->(a::petit,a::grand) |a::b::q->fend q ((min a b)::petit) ((max a b)::grand) in fend liste [] [] ;; let minetmax liste=let (p,g)=fend_tout liste in print_string "Voici le plus petit : ";print_int (min_liste p); print_newline(); print_string "Voici le plus grand : ";print_int (max_liste g); print_newline() ;; #open "random";; init (int_of_float (sys__time()));; let essai n = let rec ajoute k l=if k=0 then l else ajoute (k-1) ((int 1000)::l) in ajoute n [];; let test=essai 50;; minetmax test;; (* ci-dessous une version tableau *) let minetmaxtab t= let swap p q= let mem=t.(p) in (t.(p)<-t.(q);t.(q)<-mem) and mini=ref 44 and maxi=ref 44 and long=vect_length t and demi=(vect_length t) /2 in for k=0 to demi do if t.(k)>t.(long-1-k) then swap k (long-1-k); done; mini:=t.(0); for k=1 to demi+1 do if t.(k)< !mini then mini:=t.(k); done; maxi:=t.(long-1); for k=long-2 downto demi do if t.(k)> !maxi then maxi:=t.(k); done; print_string"Voici le plus petit : ";print_int (!mini); print_newline(); print_string"Voici le plus grand : ";print_int (!maxi); print_newline() ;; minetmaxtab [|11;8;5;7;2;4;6;9;3;4;5;8|];; (* ci-dessous une version tableau qui renvoie les emplacements des plus petits et plus grands,l'idée est juste d'utiliser un tableau de faux pointeurs *) let range n= let rec prefixe p q= if p=q then [q] else p::prefixe (p+1) q in vect_of_list(prefixe 0 n) ;; (* ci-dessous "ou" signifie "où se trouve (k)?" *) let placeminetmaxtab t= let mini=ref 44 and maxi=ref 44 and long=vect_length t and demi=(vect_length t) /2 in let ou=(range long) in let swap p q= let mem=ou.(p) in (ou.(p)<- ou.(q);ou.(q)<-mem) in for k=0 to demi do if t.(ou.(k))>t.(ou.(long-1-k)) then swap k (long-1-k); done; mini:=ou.(0); for k=1 to demi+1 do if t.(ou.(k))< t.(!mini) then mini:=ou.(k); done; maxi:=ou.(long-1); for k=long-2 downto demi do if t.(ou.(k))> t.(!maxi) then maxi:=ou.(k); done; print_string"Voici le plus petit : ";print_int (t.(!mini)); print_newline(); print_string"Rang du plus petit : ";print_int (!mini); print_newline(); print_string"Voici le plus grand: ";print_int (t.(!maxi)); print_newline(); print_string"Rang du plus grand : ";print_int (!maxi); print_newline() ;;