Correction - Algo, la page
Transcription
Correction - Algo, la page
Algorithmique Correction Contrôle no 1 S1 – Epita 26 oct 2015 - 09 :00 Solution 1 (Types Abstraits : Listes itératives – 2 points) préconditions Pas de préconditions ! axiomes λ ̸= liste-vide & 16k6longueur(λ) ⇒ ieme(inverser(λ),k)=ieme(λ, longueur(λ)-k+1) longueur(inverser(λ)) = longueur(λ) avec λ : Liste k : Entier Note : il n’y a pas besoin d’axiome pour le cas liste-vide : longueur(λ) = 0 ⇒ λ = liste-vide, donc le dernier axiome suffit ! Solution 2 (Types Abstraits : Vecteurs – 4 points) Eventuelles préconditions et Axiomes déduisant une valeur pour la réinitialisation d’un emplacement i d’un vecteur v : préconditions Pas de préconditions ! axiomes borneinf(v) 6 i 6 bornesup(v) ⇒ init(réinitialise(v,i),i)=faux borneinf(v) 6 i 6 bornesup(v) & borneinf(v) 6 j 6 bornesup(v) & i̸=j ⇒ init(réinitialise(v,i),j) = init(v,j) borneinf(v) 6 i 6 bornesup(v) & borneinf(v) 6 j 6 bornesup(v) & i̸=j ⇒ ième(réinitialise(v,i),j) = ième(v,j) borneinf(réinitialise(v,i))=borneinf(v) bornesup(réinitialise(v,i))=bornesup(v) avec vecteur entier v i, j 1 Algorithmique Correction Contrôle no 1 – D.S. 308817.46 BW S1 Epita Solution 3 (for_all2 – 5 points) 1. Spécifications : La fonction for_all2 : — prend en paramètre une fonction de test (un prédicat) à deux paramètres : p ainsi que deux listes : [a1 ; a2 ; · · · ; an ] et [b1 ; b2 ; · · · ; bn ]. — calcule p a1 b1 && p a2 b2 && · · · && p an bn . — déclenche une exception Invalid_argument si les deux listes sont de longueurs différentes. ♯ let rec for_all2 p list1 list2 = match (list1, list2) with ([],[]) -> true | (_,[]) | ([],_) -> failwith "for_all2:listes de longueurs différentes" | (a::l1,b::l2) -> p a b && for_all2 p l1 l2 ;; val for_all2 : (’a -> ’b -> bool) -> ’a list -> ’b list -> bool = <fun> 2. Spécifications : La fonction equal prend deux listes en paramètres. Elle retourne vrai si elles sont identiques, f aux sinon. Elle déclenche une exception si les deux listes sont de longueurs différentes. ♯ let equal list1 list2 = for_all2 (=) list1 list2 ;; val equal : ’a list -> ’a list -> bool = <fun> Solution 4 (Tri par insertion – 9 points) 1. Spécifications : La fonction insert x l comp ajoute l’élément x à sa place dans la liste l triée selon l’ordre donné par la fonction de comparaison comp. ♯ let rec insert x list comp = match list with | [] -> x::[] | e::l when comp x e -> x::e::l | e::l -> e :: insert x l comp ;; val insert : ’a -> ’a list -> (’a -> ’a -> bool) -> ’a list = <fun> 2. Spécifications : La fonction insertion_sort comp list trie la liste list selon l’ordre donné par la fonction comp. ♯ let rec insertion_sort comp = function [] -> [] | e::l -> insert e (insertion_sort comp l) comp ;; val insertion_sort : (’a -> ’a -> bool) -> ’a list -> ’a list = <fun> Version terminale : ♯ let insertion_sort_term comp l = let rec sort accu = function [] -> accu | e::l -> sort (insert e accu comp) l in sort [] l ;; val insertion_sort_term : (’a -> ’a -> bool) -> ’a list -> ’a list = <fun> 2