0% ont trouvé ce document utile (0 vote)
395 vues8 pages

TP Caml pour Étudiants en Informatique

Ce document contient la description de plusieurs fonctions en CAML comme Succ, Pred, Sum, Max, MinMax, Carre, SCarre, ValAbs, Surf, Pair, Prem, Fact, Exp, Sigma, Sigma2, Fib, PGCD, PGCD2, SumSerie, nbElm, somElm, moyenne, ins, ins_fin, supp_deb, supp_fin, inv, appartient, occ, Map, tri, Mult_egypt, ppcm, inv, palind, bissextile, prod, puiss, rest, quot.

Transféré par

Arslan Dif
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
395 vues8 pages

TP Caml pour Étudiants en Informatique

Ce document contient la description de plusieurs fonctions en CAML comme Succ, Pred, Sum, Max, MinMax, Carre, SCarre, ValAbs, Surf, Pair, Prem, Fact, Exp, Sigma, Sigma2, Fib, PGCD, PGCD2, SumSerie, nbElm, somElm, moyenne, ins, ins_fin, supp_deb, supp_fin, inv, appartient, occ, Map, tri, Mult_egypt, ppcm, inv, palind, bissextile, prod, puiss, rest, quot.

Transféré par

Arslan Dif
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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);;

Vous aimerez peut-être aussi