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

Documents pareils