Vous êtes sur la page 1sur 3

Université M’Hamed Bougara de Boumerdes 2020/2021

Faculté des sciences - Département d’informatique

Module : PFA (Master 1) Responsables du cours :R. LOUNAS, L.IIZA, M. CHAABANI

Série 01 : Entiers, listes, récursivité

Exercice 01 :

(a) Écrire une fonction Ocaml qui prend en arguments les coefficients a, b et c d'une équation du
second degré (ax2+ bx + c = 0) et retourne le nombre de solutions réelles de cette équation.

(b) On considère un nombre rationnel comme une pair (num, den) de deux nombres entiers,
représentant une fraction. 1- Ecrire une fonction norm qui normalise une fraction, c'est-à-dire norm
réduit une fraction telle que numérateur et dénominateur n'ont pas de facteurs en commun. Par
exemple norm (4, 6) évalue à (2,3). (Utiliser une fonction pgcd).

2- Définir deux fonctions somme et produit qui calculent, respectivement, la somme et le produit de
deux fractions. On demande que le résultat soit une fraction normalisée.

Exercice 02 : Ecrire les fonctions suivantes et noter le type à chaque fois :

1. On définit la fonction de Fibonnaci par fib (0) = 1, fib (1) = 1, et fib (n) = fib (n-1)+fib (n-2)
Ecrire une fonction récursive qui définit cette fonction.

2. Ecrire une fonction qui calcule les coefficients du binome par la méthode recursive simple :
Cpn = Cpn-1 + Cp-1n-1

3. On veut compter le nombre de chiffres d’un nombre entier positif en base 10. Exemples : 34 à
2 chiffres, et 3 à 1 chiffre. Ce calcul peut utiliser la propriété suivante: Nbchiffres(n) =1 si n
<9, Nbchiffres(n) = 1 + nbchiffres(n/10) sinon

4. Ecrire une fonction qui prend en argument deux bornes n et m et une fonction f et
calcule sum n m f = ∑i=nmf(i). Proposer un exemple pour l’évaluation.

Exercice 03: Trouver une fonction pour chacun des types suivants :

(intint)int (intint) intint 'a -> ('a -> 'a) -> 'a
('a*'a -> 'b) -> 'a -> 'b 'a -> 'a -> 'a -> 'a

Exercice 04: Vérifier le respect des règles de portée sur les expressions suivantes. Pour les
expressions correctes données leurs types et valeurs. Pour les autres, expliquer pourquoi il y a erreur.

- let (-) = let f = let x = 1 in let y=2 in x in f - x;;


- let (**) x = x*1 in ** 2;;
- let (++) f g x = g (f x) in let f x = x*3 and let g x = x+1 in (f++g)3;;
- let (-) = let f = let x = 1 in let y=2 in x in f - x;;
- let (++) x = x+1 in ++ 2;;
- let (/) f g h x= h(f (g x)) in let h x = x in let g x y = x+y in let f x = x*2 in (((h
/f)g) 2);;
Exercice 05: Ecrire les fonctions suivantes : (noter les types)

1. Ecrire une fonction récursive qui prend en entrée deux listes représentant deux vecteurs et
retourne le produit scalaire.

2. une fonction récursive qui prend une liste et retourne l’inverse de cette liste.

3. Ecrire une fonction récursive qui effectue la somme de deux listes élément par élément.

4. Une fonction qui prend une liste contenant des paires d’entiers et retourne la liste contenant
les pairs ou la les deux composantes de la paire ont la même valeur.

5. Ecrire une fonction carre qui prend en entré une liste des entiers et donne en sortie la liste des
carrés des entiers.

6. Généraliser la question 6 en donnant une fonction app qui s'applique à une fonction arbitraire,
donnée comme argument, à chaque élément d'une liste. Par exemple : app (fun x -> x*x) [1 ;
2 ;3] évalue à [1 ;4 ;9]
Exercice 06: (noter les types)

1- En utilisant la fonction max prédéfinie, écrire un programme maxlist qui prend en entré une liste
des entiers et donne en sortie le maximum entre 0 et les entiers dans la liste.
2- Généraliser les deux exercices précédents, en donnant une fonction itera qui s'applique à une
fonction binaire f, une liste [e1 ;e2 ;...] et un argument x d'égal type que les éléments de la
liste, et donne comme résultat l'itérations de f aux éléments de la liste plus x. C'est-à-dire :
itera f [e1 ;e2 ; ... en] x évalue à f e1 (f e2 ... (f en x)...)

Exemple : itera add [4 ;2 ;5] 0 évalue à 11 et itera max [4 ;2 ;5] 0 évalue à 5

Exercice 07: Soit la fonction d’Ackermann définie récursivement sur les entiers comme suit :

1- Traduire cette fonction, qu’on appellera ack , en Ocaml.


2- Ecrire une fonction qui prend une liste de couples et retourne la liste des couples qui satisfont
la condition suivante : la deuxième composante du couple est le résultat de l’application de la
fonction ack sur la première composante et une valeur v passée en argument.
3- Ecrire une fonction gen permettant de généraliser le traitement de la fonction de la question
deux : le couple est gardé dans la liste si sa deuxième composante est le résultat de
l’application d’une fonction quelconque f sur la première composante et la valeur v.
4- Donner le type de la fonction gen.

Exercice 08: Ecrire les fonctions récursives suivantes :

1. Ecrire une fonction récursive permettant de calculer le nombre de zéros dans une liste
d’entiers.
2. Ecrire une fonction récursive eliminerZero qui prend en argument une liste d’entiers et
retourne cette liste sans les éléments nuls (les zéros)

3. Ecrire une fonction qui prend en entrée une liste de listes d’entiers et qui donne en
sortie cette liste après avoir éliminé tout les zéros dans chacune des listes contenue
dans la grande liste. Cette fonction appelle la fonction eliminerZero.

Vous aimerez peut-être aussi