TP 2
Judicaël Courant
∗Le 27 février 2016
1 Quelques fonctions essentielles sur les listes
Les fonctions suivantes sont à écrire. Une fois écrites, elles sont à connaître par cœur: elles vous permettront de gagner un temps précieux, en particulier lors des écrits des concours.
1. list_length : ’a list -> int telle que length l retourne la longueur de la listel.
2. append : ’a list -> ’a list -> ’a list concatène les deux listes qui lui sont passées en argument. La fonctionappendexiste en fait déjà en Caml-Light sous la forme de l’opérateur binaire@.
3. rev : ’a list -> ’a listrenverse une liste. On fera en sorte querev leffectue au plus n opérations :: si l est de longueur n (il sera donc préférable de ne pas utiliser@).
4. map : (’a -> ’b) -> ’a list -> ’b list telle que map f [a1;...; an] ap- plique tour à tour la fonction f à a1, ..., an et construit la liste [f a1; ...; f an] des résultats retournés par f.
5. filter : (’a -> bool) -> ’a list telle que filter f l retourne la liste des éléments xde l tels que le booléenf x vauttrue.
6. flat_map : (’a -> ’b list) -> ’a list -> ’b listtelle queflat_map f [l1;
...; ln]vaut (f l1) @ (f l2) @ ... @ (f ln).
7. for_all : (’a -> bool) -> ’a list -> bool telle que for_all p [a1; ...;
an] vaut(p a1) && (p a2) && ... && (p an).
8. exists : (’a -> bool) -> ’a list -> booltelle queexists p [a1; ...; an]
vaut (p a1) || (p a2) || ... || (p an).
9. mem : ’a -> ’a list -> bool telle que mem a lest vrai si et seulement sia est égal à un élémént del.
∗cbaCette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.
1
Option informatique MPSI La Martinière Monplaisir 2015-2016
NB : list_length, rev, map, flat_map, for_all, exists et mem sont déjà définies en Caml-Light. Vous pouvez donc les utiliser dans tous les sujets d’écrit sans justification.
La fonction filtern’existe pas en Caml-Light,1 pour l’utiliser dans un sujet d’écrit, il faudra donc au préalable la définir au moins une fois dans votre copie. Mais c’est une bonne idée car cela vous permet de gagner du temps par la suite et d’améliorer la lisibilité de votre copie
2 D’autres fonctions sur les listes
Écrire les fonctions suivantes :
1. it_list : (’a -> ’b -> ’a) -> ’a -> ’b list -> ’a telle que it_list f a [b1; ...; bn] vautf (... (f (f a b1) b2) ...) bn.
2. list_it : (’a -> ’b -> ’b) -> ’a list -> ’b -> ’btelle quelist_it f [a1;
...; an] bvaut f a1 (f a2 (... (f an b) ...)).
3. Utilisez une de ces fonctions pour écrire une fonctionsum : float list -> float retournant la somme des éléments d’une liste de flottants.
4. Utilisez ces fonctions pour récrire les fonctions de la partie précédente (list_length, rev,append,map,filter) en une ligne chacune.
NB : ces fonctionsit_listetlist_itsont prédéfinies en Caml-Light. Elles sont très puissantes mais il ne faut pas en abuser (si vous utilisez dans une même ligne à la fois list_it et it_list, vous aurez un code certes très concis mais hélas complètement hermétique).
3 Préliminaires
1. Écrire une fonction
range : int -> int list
telle que range nretourne la liste des entiers de [[0, n[[.
2. Écrire une fonction
random_list : int -> int -> int list
telle querandom_list n pretourne une liste denentiers tirés aléatoirement dans
[[0, p[[. On utilisera random__int : int -> int pour tirer des entiers aux hasard
(voir la documentation du modulerandom).
3. Écrire une fonction
est_triee : ’a list -> bool
retournant vrai si et seulement si la liste donnée en argument est triée par ordre croissant.
1. Mais elle est prédéfinie en Objective Caml.
2
TP 2
4 Tri par insertion
1. Écrire une fonction
insere : ’a -> ’a list -> ’a list
insérant dans une liste l supposée triée par ordre croissant un élémentx déjà à sa place.
2. Écrire une fonction
tri_insertion : ’a list -> ’a list triant une liste par insertion par ordre croissant.
3. Testez votre fonction de tri sur des listes d’entiers. Une fois que vous serez convaincu de la correction de votre programme, vous en étudierez (brièvement) la perfor- mance, sur des listes d’entiers :
a) de contenu aléatoire ; b) triées par ordre croissant ;
c) triées par ordre décroissant.
Pour le premier point, on pourra utiliser la fonction est_triee pour tester le ré- sultat obtenu (pour les deux autres, on pourra comparer la liste obtenue à la liste range n).
5 Tri par pivot
1. Écrire une fonction
partitionne : ’a -> ’a list -> ’a list * ’a list
Telle quepartitionne x l retourne un couple (u, v)où u contient tous les élé- ments de lstrictement inférieurs àx etu tous ceux qui sont supérieurs ou égaux à x. On dit qu’on effectue la partition del à l’aide du pivotx.
2. Écrire une fonction
tri_pivot : ’a list -> ’a list
triant une liste par ordre croissant en utilisant la méthode du pivot de la façon suivante :
— Si la liste est vide, on la rend ;
— sinon, on prend le premierxélément de la liste. On partitionne le reste de la liste en deux listesuetven prenant cette valeurxpour pivot. On trie récursivement chacune des deux listes et on met bout-à-bout la première liste triée, x et la seconde liste triée.
3. Testez votre fonction de tri (même question que pour le tri par insertion).
6 Tri fusion
1. Écrire une fonction
3
Option informatique MPSI La Martinière Monplaisir 2015-2016
partage : ’a list -> ’a list * ’a list
découpant la liste passée en argument en deux listes de longueur égale (à un près si la liste d’entrée est de longueur impaire).2
2. Écrire une fonction
fusionne : ’a list -> ’a list -> ’a list
fusionnant deux listes supposées triée par ordre croissant3 en une liste triée par ordre croissant.
3. Écrire une fonction
tri_fusion : ’a list -> ’a list
triant par ordre croissant la liste passée en argument en utilisant la méthode du tri fusion.
4. Testez votre fonction de tri (même question que pour le tri par insertion).
2. NB : il existe plusieurs façons de faire cela.
3. NB : Si l’énoncé vous dit qu’elles sont supposées triées, la fonction que vous écrivez n’a pas à le vérifier.
4