Algorithmique Correction Contrôle no 1 (C1) - Algo, la page
Transcription
Algorithmique Correction Contrôle no 1 (C1) - Algo, la page
Algorithmique Correction Contrôle no 1 (C1) Info-sup (S1) Epita 10 nov 2014 - 10 :00 Solution 1 (Types Abstraits : Listes récursives 5 points ) 1. L'opération rechercher n'est dénie que si l'élément recherché existe, d'où précondition. Ensuite les trois axiomes appliquant l'observateur est-présent aux opérations internes liste-vide et cons. Dans l'ordre : l'élément e n'existe pas dans une liste-vide, l'élément e existe dans une liste dont il est égal au premier élément et dans le cas contraire... Essaie encore (il existe peut-être dans la liste restante). Enn l'axiome expliquant que la place retournée par rechercher(e,λ) est celle qui contient e. préconditions rechercher (e, axiomes λ) est-déni-ssi est-présent (e,λ)= vrai est-présent (e, listevide) = faux e = e′ ⇒ est-présent (e, cons(e′ , λ)) e ̸= e′ ⇒ est-présent (e, cons(e′ , λ)) contenu (rechercher(e, λ)) = e = vrai = est-présent (e, λ) 2. Deux axiomes suront, le premier explique que le résultat de la concaténation d'une liste vide avec une liste λ est la liste λ, ce qui signie que l'on conserve les éléments en ordre et nombre de la deuxième liste. Le second axiome explique que l'on conserve aussi les éléments en ordre et nombre de la première liste. Comment ? En montrant que si l'on fait la concaténation avant ou après la construction (cons), le résultat est le même, ce qui signie que la concaténation ne modie ni l'ordre, ni les éléments. axiomes concaténer concaténer (listevide, λ2) = λ2 (cons(e, λ), λ2) = cons(e, concaténer (λ, λ2)) 1 Algorithmique Info-sup (S1) Epita Correction Contrôle no 1 (C1) D.S. 309858.67 BW Solution 2 (Find it 5 points ) 1. Spécications : La fonction find_place prend en paramètre une fonction de test : f ainsi qu'une liste : [a1 ; a2 ; · · · ; an ]. Elle recherche dans la liste la première valeur ai telle que f (ai ) soit vrai et retourne le rang i correspondant. Elle déclenche une exception si aucune valeur n'a été trouvée. ♯ let find_place f list = let rec find i = function [] -> failwith "find_place: not found" | e::l -> if f e then i else find (i+1) l in find 1 list ;; val find_place : ('a -> bool) -> 'a list -> int = <fun> ♯ let rec find_place p = function (* another version *) [] -> failwith "find_place: not found" | e::_ when p e -> 1 | _::l -> 1 + find_place p l ;; val find_place : ('a -> bool) -> 'a list -> int = <fun> 2. Spécications : La fonction find_odd retourne la position du premier entier impair trouvé dans la liste passée en paramètre. ♯ let find_odd = find_place (function x -> x mod 2 = 1) ;; val find_odd : int list -> int = <fun> 2 Algorithmique Info-sup (S1) Epita Correction Contrôle no 1 (C1) D.S. 309858.67 BW Solution 3 (Test it 5 points ) 1. Spécications : La fonction test prend en paramètre une fonction de comparaison : f ainsi qu'une liste. Elle vérie si la liste est triée selon la fonction f . ♯ let rec test_order f = function [] | _::[] -> true | e1::e2::l -> f e1 e2 && test_order f (e2::l) ;; val test_order : ('a -> 'a -> bool) -> 'a list -> bool = <fun> (* another version *) ♯ let rec test_order f = function [] | _::[] -> true | e1::e2::l when f e1 e2 -> test_order f (e2::l) | _ -> false ;; val test_order : ('a -> 'a -> bool) -> 'a list -> bool = <fun> 2. Spécications : La fonction is_geometric prend en paramètre un entier q et une liste l. Elle vérie si l suit une progression arithmétique de raison q . ♯ let is_geometric q = test_order (function e1 -> function e2 -> e2 = q*e1) ;; val is_geometric : int -> int list -> bool = <fun> Solution 4 (Combine it 5 points ) Spécications : La fonction combfilter prend en paramètre une fonction à deux paramètres : f ainsi que deux listes : [a1 ; a2 ; · · · ; an ] et [b1 ; b2 ; · · · ; bn ]. Elle construit la liste des (ai , bi ) tels que f ai bi est vrai. L'ordre des éléments des listes initiales est préservé. Elle déclenche une exception si les deux listes sont de longueurs diérentes. let rec combfilter p list1 list2 = match (list1,list2) with ([],[]) -> [] | (_,[])|([],_) -> failwith "different lengths" | (e1::l1,e2::l2) -> if p e1 e2 then (e1,e2) :: combfilter p l1 l2 else combfilter p l1 l2 ;; val combfilter : ('a -> 'b -> bool) -> 'a list -> 'b list -> ('a * 'b) list = <fun> 3