Ocaml - Exercices Exercice Définir en Ocaml les fonctions suivantes:. f : x sin x + cos x. g : x x 3x+ x x 5 3. Fonction h calculant la moyenne géométrique de deux float positifs ( xy) Exercice Ecrire une fonction récursive puissance : float -> int -> float calculant x n en utilisant la relation de récurrence suivante : { } x 0 = x n = x x n Exercice 3 Le but de cet exercice est de modéliser les suites définies par récurrence de la façon suivante : { u0 = a u n = f(u n ) si n Ces suites dépendent donc d un terme initial a et d une fonction f permettant de calculer le terme u n connaissant le terme u n.. Ecrire une fonction u permettant de calculer u n. Quel est le type de la fonction u?. En utilisant la fonction u, définir la suite b n = n (on veut une suite à valeurs réelles). Pour répondre à cette question, on mettra bien en évidence quel est le premier terme et quelle est la fonction permettant de calculer le terme de rang n à partir du terme de rang n. Exercice Ecrire une fonction qui calcule la troisième projection d un triplet. Exercice 5 [Fonctions caractéristiques] Soit L une liste quelconque. La fonction caractéristique de L, notée f L, est définie par { true si x L f L (x) = false si x L Soit L une liste finie. Ecrire une fonction qui genère la fonction caractéristique de L. Exercice Ecrire les fonctions qui calculent. le n ième élément d une liste;. le nombre d occurrences d un élément dans une liste; 3. le nombre d éléments dans une liste qui vérifient un prédicat p;. la liste des nombres de à n dans cet ordre. Exercice 7 Ecrire une fonction partition qui partitionne une liste en deux selon que les éléments vérifient ou non un prédicat p. p sera donc un argument de la fonction, le résultat de cette fonction sera un couple de listes. Exercice 8 Ecrire une fonction récursive terminale, inverser, qui inverse une liste, c.à.d inverser [;;3;] retourne [; 3; ; ]
Exercice 9 Le but de cet exercice est de modéliser les suites u à valeur dans un ensemble E et définies par récurrence de la façon suivante: { u0 = a u n = f(u n ) si n > 0 où a E et f est une application de E vers E. On désire résoudre ce problème en effectuant une analyse menant à l écriture d une fonction récursive terminale. a f n {}}{ { }} { {}}{ Ecrire une fonction u : a ( a a) int a prenant les trois paramètres a, f, n et calculant le terme général u n, dans cette fonction on définira une fonction récursive terminale. Exercice 0. Ecrire une fonction supprime de type a -> a list -> a list qui supprime toutes les occurrences d un élément dans une liste. Par exemple (supprime [ ; ; 3 ; ; ; 0 ; ]) doit fournir la liste [ ; 3 ; ; 0].. Ecrire une fonction supprime rec ter, de même type que supprime, calculant les mêmes résultats et utilisant une fonction récursive terminale g. Exercice Le but de cet exercice est d introduire quelques notions de base concernant les arbres binaires qui sont une structure parmi les plus importantes et les plus spécifiques de l informatique. Ici on utilisera la structure d arbre pour effectuer un tri. Arbre binaire Un arbre binaire non vide est composé d une racine et de deux arbres binaires appelés sous-arbre droit et sous-arbre gauche. Par exemple un arbre binaire peut être représenté graphiquement comme suit : 3 5 0 9 Soit t cet arbre. La racine de t est, les sous-arbres gauche et droit de t sont respectivement les arbres t et t3 suivants: t, sous-arbre gauche : 3 5 On définit en Ocaml le type a arbin de la façon suivante : t3, sous-arbre droit : type a arbin = Bin of ( a arbin * a * a arbin) Vide ;; Ainsi, en Ocaml, les arbres t et t3 sont représentés respectivement par Bin(Bin(Vide, 5, Vide), 3, Vide) et par Bin(Bin(Vide, 0, Vide),, Bin(Vide, 9, Vide)). On peut obtenir t en laissant Ocaml évaluer let t = Bin (t,, t3) ;; val t : int arbin = Bin (Bin (Bin (Vide, 5, Vide), 3, Vide),, ~ Bin (Bin (Vide, 0, Vide),, Bin (Vide, 9, Vide))) Parcours infixé d un arbre binaire Le parcours infixé d un arbre binaire consiste à effectuer dans l ordre : le parcours infixé du sous-arbre gauche le parcours de la racine le parcours infixé du sous-arbre droit 0 9 Par exemple le parcours infixé de l arbre t donné en introduction produit la liste [5; 3; ; 0; ; 9] Question Ecrire une fonction infixe : int arbin -> int list qui produit la liste des éléments d un arbre binaire selon un parcours infixé. On pourra utiliser l opérateur @ qui effectue la concaténation des listes. (x @ y est la liste obtenue en concaténant (en mettant bout à bout) les listes x et y).
Arbres binaires ordonnés On dit qu un arbre binaire est ordonné si et seulement si, soit c est l arbre vide, soit les conditions suivantes sont vérifiées : les sous-arbres droit et gauche sont ordonnés la racine est supérieure ou égale à tous les éléments du sous-arbre gauche et strictement inférieure à tous les éléments du sous-arbre droit. Remarquons que le parcours infixé d un arbre binaire ordonné fournit une liste ordonné. Par exemple le parcours infixé de l arbre ordonné t suivant : produit la liste ordonnée [; ; ; ; ; 0; ]. L insertion d un élément dans un arbre binaire ordonné consiste à ajouter cet élément de façon à obtenir un arbre binaire ordonné. L élément ajouté devient une feuille de l arbre. Par exemple si l on veut insérer l élément à l arbre binaire ordonné précédent on obtient l arbre ordonné suivant : Question Ecrire une fonction insere : a -> a arbin -> a arbin. Cette fonction prend comme données un entier et un arbre binaire ordonné, et insère l entier dans l arbre binaire de telle façon que le résultat soit un arbre binaire ordonné. La méthode de tri proposée consiste à partir d une liste d entiers à construire un arbre binaire ordonné par des insertions successives des éléments de la liste, puis à parcourir l arbre suivant un parcours infixé. Question 3 Ecrire une fonction insere liste: a list -> a arbre. Cette fonction prend en argument une liste et produit un arbre binaire ordonné par des insertions successives de tous les éléments de la liste. Par exemple pour la liste [; 7; ; 9; ] on obtient l arbre suivant : 7 Question Ecrire une fonction tri : a list -> a list qui trie une liste donnée. Pour cela on utilisera les fonctions insere liste et infixe. 0 0 9 3
Solutions Exercice : Solution. let f = function x -> sin x +. cos x ;;. let g = function x -> (x *. x -. 3. *. x +..) /. (. *. x *. x -.. *. x -. 5. ) ;; 3. let h = function x -> function y -> sqrt (x *. y) ;; Exercice : Solution let rec puissance = function x -> function n -> match n with 0 ->. n -> x *. puissance x (n-) ;; Exercice 3 : Solution. let rec u = function a -> function f -> function n -> if n = 0 then a else f (u a f (n-)) ;;. Pour la suite b, on a a =. et f = (function x ->. *. x). let b = u. (function x ->. *. x) ;; b 0 ;; - : float = 0. Exercice : Solution let p3 (,,z) = z ;; Exercice 5 : Solution let rec f_car_de l = [] -> (function x -> false) t::q -> (function x -> x=t (f_car_de q) x) ;; val f_car_de : a list -> a -> bool = <fun> let l = [;3;5;] ;; let cf_l = f_car_de l ;; val cf_l : int -> bool = <fun> cf_l 3 ;; - : bool = true cf_l ;; - : bool = false Exercice : Solution. let rec nieme = function n -> function l -> match (n,l) with (_, []) -> failwith "liste trop courte (ou vide)" (, t :: _) -> t (n, _ :: l) -> nieme (n-) l ;;. let rec nb_occurrence = function e -> function l -> [] -> 0 x :: l -> if e = x then + nb_occurrence e l else nb_occurrence e l ;; 3. let rec nombre_element = function p -> function l -> [] -> 0 x :: l -> if p x then + nombre_element p l else nombre_element p l ;;
let rec gen_list = function n -> match n with 0 -> [] n -> gen_list (n-) @ [n] ;; Exercice 7 : Solution let rec partition = function p -> function l -> [] -> ([],[]) h::t -> let (u,v) = partition p t in if p h then (h::u,v) else (u,h::v) ;; val partition : ( a -> bool) -> a list -> a list * a list = <fun> partition (function x -> x mod = 0) [;;3;;5;;7;8;9;0] ;; - : int list * int list = ([; ; ; 8; 0], [; 3; 5; 7; 9]) Exercice 8 : Solution let inverser l = let rec g li lo = match li with t::q -> g q (t::lo) [] -> lo in g l [] ;; val inverser : a list -> a list = <fun> inverser [;;3;] ;; - : int list = [; 3; ; ] Exercice 9 : Solution let u = function a -> function f -> function n -> let rec g = function (i, r) -> if i=n then r else g(i+, f r) in g(0, a) ;; Exercice 0 : Solution. let rec supprime = function e -> function l -> [] -> [] x :: l -> if x = e then supprime e l else x :: (supprime e l) ;; supprime [ ; ; 3 ; ; ; 0 ; ] ;;. let supprime_rec_ter = function e -> function l -> let rec g = function (ld,lr) -> match (ld,lr) with ([], lr) -> lr (x :: ld, lr) -> if x=e then g (ld, lr) else g (ld, lr @ [x]) in g (l, []) ;; supprime_rec_ter [ ; ; 3 ; ; ; 0 ; ] ;; Exercice : Solution Question let rec infixe = function a -> match a with Vide -> [] Bin (sag,r,sad) -> (infixe sag) @ (r :: infixe sad) ;; val infixe : a arbin -> a list = <fun> Question 5
let rec insere = function e -> function a -> match a with Vide -> Bin (Vide,e,Vide) Bin (sag,r,sad) when e <= r -> Bin ((insere e sag),r,sad) Bin (sag,r,sad) -> Bin (sag,r,insere e sad) ;; val insere : a -> a arbin -> a arbin = <fun> Question 3 let rec insere_liste = function l -> [] -> Vide (x :: l) -> insere x (insere_liste l) ;; val insere_liste : a list -> a arbin = <fun> Question let tri = function l -> infixe (insere_liste l) ;; val tri : a list -> a list = <fun>