USTHB
Faculté Informatique
TP Caml
Section 3 – Groupes 2 & 4
TP CaML Ligh
TP2 : Les Fonctions
Ecrire en langage CAML les fonctions suivantes
1. Succ qui calcule le successeur d’un entier.
let Succ x = x+1;;
2. Pred qui calcule le prédécesseur d’un entier.
let Pred x = x-1;;
3. Sum qui calcule la somme de 2 entiers.
let Sum x y = x+y;;
4. Max qui calcule le maximum de 2 réels.
let Max x y = if x>y then x else y;;
5. Max3 qui calcule le maximum de 3 réels de 2 façons différentes (Sans utiliser Max,
puis en utilisant Max).
let Max3 x y z = if x>y then (if x>z then x else z) else (if y>z then y else z);;
let Max3 x y z = Max(Max x y) z;;
6. MinMax qui donne le min et le max en même temps de 2 entiers.
let MinMax x y = if(x>y) then (x,y) else (y,x);;
7. Carre qui calcule le carre d’un entier.
let carre x = x*x;;
8. SCarre qui calcule la somme des carrés de 2 entiers (en utilisant la fonction Carre).
let SCarre x y = carre(x)+carre(y);;
9. ValAbs qui calcule la valeur absolue d’un entier. - Abs qui calcule la fonction :
Abs (x, y ) = | x – y | .
let ValAbs x = if(x<0) then x*(-1) else x;;
10. Surf qui calcule la suface d’un cercle de rayon r (∏ = 3.14).
let surf r = float_of_int(carre r) *. 3.14;;
11. Pair qui retourne vrai si son argument est un entier pair, faux sinon.
let pair x = if (x mod 2 =0) then true else false;;
12. Prem qui retourne vrai si son argument est un entier premier, faux sinon
let rec ndiv_se x i = if i>x then 0
else if i<1 then ndiv_se x 1
else if i=x then 1
else if x mod i =0 then 1+ndiv_se x (i+1)
else ndiv_se x (i+1);;
TP3 : Les Fonctions Récursives
Ecrire en langage CAML les fonctions récursives suivantes :
1. Fact : factoriel d’un entier n.
let rec fact n = if n = 0 then 1 else n * fact (n-1) ;;
2. Exp qui calcule la fonction : Exp (x , y ) = xy.
let rec Exp x y = if y=0 then 1 else x*(Exp x (y-1));;
3. Sigma : la somme des entiers de 0 à x.
let rec sigma x = if x=0 then 0 else x+sigma(x-1);;
4. Sigma2 : la somme des entiers compris entre 2 entiers a et b.
let rec sigma2 a b = if a=b then a else a+(sigma2(a+1) b);;
5. Fib : la fonction Fibbonacci définie par :
𝟎 𝒔𝒊 𝒏 = 𝟎
𝑭𝒊𝒃(𝒏) = { 𝟏 𝒔𝒊 𝒏 = 𝟏
𝑭𝒊𝒃(𝒏 − 𝟏) + 𝑭𝒊𝒏(𝒏 − 𝟐) 𝒔𝒊𝒏𝒐𝒏
let rec Fib n = if n=0 then 0 else if n=1 then 1 else Fib (n-1)+Fib (n-2) ;;
6. PGCD : la fonction qui calcule le PGCD de 2 entiers, en utilisant l'algorithme
d'Euclide : PGCD(a,b) = PGCD(b,r), où r est le reste de la division de a par b
let rec PGCD a b = if b=0 then a else PGCD b (a mod b);;
7. PGCD2 : la fonction qui calcule le PGCD de 2 entiers, en utilisant l'algorithme
suivant :
𝒂 𝒔𝒊 𝒂 = 𝒃
𝑷𝑮𝑪𝑫𝟐(𝒂, 𝒃) = {𝑷𝑮𝑪𝑫𝟐(𝒂 − 𝒃, 𝒃) 𝒔𝒊 𝒂 > 𝒃
𝑷𝑮𝑪𝑫𝟐(𝒂, 𝒃 − 𝒂) 𝒔𝒊 𝒂 < 𝒃
let rec PGCD2 a b= if a=b then a else if a>b then PGCD (a-b) b else PGCD a (b-a);;
8. SumSerie : la fonction qui calcule la somme des n premiers termes de la série
harmonique de la forme :
let rec SumSerie n = if n=0 then 0. else 1.0 /. float_of_int n +. SumSerie (n-1);;
TP4 : Les Listes
Ecrire en langage CAML les fonctions récursives suivantes :
1. Calcule le nombre d’éléments d’une liste (nbElm).
let rec nbElm x = if x=[] then 0 else 1+nbElm (tl x);;
2. Calcule la somme des éléments d’une liste (somElm).
let rec nbElm x = if x=[] then 0 else 1+nbElm (tl x);;
3. Calcule la moyenne des éléments d’une liste en utilisant les fonctions nbElm et
somElm.
let rec moyenne x = float_of_int(somElm x) /. float_of_int(nbElm x);;
4. Insère un élément au début d’une liste.
let ins x y = x::y;;
5. Insère un élément à la fin d’une liste.
let ins_fin x y = y@(x::[]);;
6. Supprime un élément au début d’une liste non vide.
let supp_deb x = tl x;;
7. Supprime un élément à la fin d’une liste non vide (utiliser la fonction nbElm).
let rec supp_fin x = if nbElm x=1 then [] else hd x :: supp_fin (tl x);;
8. Inverse une liste
let rec inv x = if x=[] then [] else inv(tl x)@(hd x::[]);;
9. Inverse une liste. 9. Projette l’élément n°I (I >0) d’une une liste non vide.
let rec inv x = if x=[] then [] else inv(tl x)@(hd x::[]);;
10. Détermine si un élément donné appartient ou non à une liste.
let rec appartient x liste = if liste=[] then false else if x=hd liste then true else appartient
x (tl liste);;
11. Prend un nombre entier et une liste d'entier et compte les occurrences de ce
nombre dans cette liste.
let rec occ x liste = if liste=[] then 0
else if x=hd liste then 1+(occ x (tl liste))
else occ x (tl liste);;
12. Calcule la fonction Map définie par : Map f [a1 ; a2 ; … ; an] -> [(f a1) ; (f a2) ; … ; (f
an)] (Distribue la fonction f sur les éléments de la liste).
• Appliquer la fonction Map pour élever au carrée les éléments d’une liste
d’entiers.
• Appliquer la fonction Map pour inverser les mots dans une liste de mots
let f x = x+1;;
let rec map f liste = if liste=[] then [] else f (hd liste)::map f (tl liste);;
let carre x = x*x;;
map carre [1;2;3;4];; [1; 4; 9; 16]
On connait déja inv:
let rec inv s = if string_length s=1 then s
else (sub_string s ((string_length s)-1) 1) ^
inv(sub_string s 0 ((string_length s)-1));;
map inv ["chat"; "lait"; "chien"] ;;
13. Trie une liste d’entiers par ordre croissant.
let rec supp_occ x liste = if hd liste = x then tl liste else hd liste::supp_occ x (tl liste);;
let rec min liste = if tl liste=[] then hd liste +0
else if hd liste>=hd(tl liste) then min(tl liste)
else min(hd liste :: tl(tl liste));;
let rec tri liste = if liste=[] then [] else min liste :: tri(supp_occ(min liste) liste);;
tri [5;1;8;3;0;10];;
TP5 : EXERCICES GENERAUX
Exercice 1
Ecrire une fonction calculant le produit de deux nombres suivant la méthode de la
multiplication dite égyptienne :
• 0 si x=0
• Mult_egypt (x,y) = Mult_egypt(x/2, 2*y) si x est pair
• y + Mult_egypt(x-1, y) sinon
let rec Mult_egypt x y= if x=0 then 0
else if x mod 2=0 then Mult_egypt (x/2) (2*y)
else y+Mult_egypt (x-1) y;;
Exercice 2
Ecrire une fonction calculant le ppcm (plus petit commun multiple). On pourra s'aider du
pgcd (plus grand commun diviseur).
On utilise la formule suivante : a*b=pgcd a b*ppcm a b
Donc:
let ppcm a b=a*b/pgcd a b ;
Exercice 3
1. Ecrire une fonction inv qui inverse un mot. Exemple "CAML" sera transformé en "LMAC"
let rec inv s = if string_length s=1 then s
else (sub_string s ((string_length s)-1) 1) ^
inv(sub_string s 0 ((string_length s)-1));;
2. Ecrire une fonction palind qui reconnaît les palindromes, comme "RADAR" ou
"eluparcettecrapule"
let rec palind s = if string_length s=1 then true
else if s.[0] <> s.[(string_length s) -1] then false
else palind(sub_string s 1 ((string_length s) -2));;
Exercice 4
Ecrire et tester la fonction de détermination des années bissextiles utilisant la définition
suivante :
« Toutes les années divisibles par 4 sont bissextiles sauf celles qui sont divisibles par 100 et
qui ne sont pas divisibles par 400. »
let bissextile annee = if annee mod 4 <> 0
then false
else if annee mod 100 = 0 && annee mod 400 <> 0
then false
else true;;
Exercice 5
1. Ecrire la fonction prod qui fait le produit de x par y, sans utliser l’opérateur *.
let rec prod x y = if y=0 then 0 else x+prod x (y-1);;
2. Ecrire la fonction puiss qui calcule la puissance xy en utilisant la fonction prod.
let rec puiss x y = if y=0 then 1 else prod x (puiss x (y-1));;
Exercice 6
1. Ecrire une fonction récursive rest qui calcule le reste de la division entière de x par y.
let rec rest x y = if x<y then x else rest (x-y) y;;
2. Ecrire une fonction récursive quot qui calcule le quotient de la division entière de x par y.
Remarque : On ne pourra pas utiliser les opérations / et mod
let rec quot x y = if x<y then 0 else 1+(quot (x-y) y);;