1
Option Informatique MP/MP*, Exercices
Judicaël Courant 12 septembre 2015 1 Listes
Le but de cet exercice est de récrire certaines fonctions usuelles sur les listes. On s’abstiendra donc d’utiliser@ourev.
1. Écrire une fonction récursive terminalerange : int -> int -> int listtelle que(range a b)retourne la liste des entiers deainclus àbexclu siaest inférieur àb, et la liste vide sinon.
Vous vérifierez qu’elle fonctionne même si la liste demandée est de grande taille (par exemple de longueur106).
2. Après avoir posé :let l = range 0 1000000, demandez à Caml ce que vautl@l. Que se passe t-il ?
3. Pour résoudre ce problème, on veut récrire la fonction @. On s’abstiendra donc par la suite d’utiliser les fonctions prédéfinies@et rev.
Écrire une fonctionrev_append : 'a list -> 'a list -> 'a listtelle que(rev_append a b)retourne le renversement deaconcaténé avecb. Par exemple(rev_append [ 1; 2 ] [ 3; 4; 5])retourne la liste[2 ; 1; 3; 4; 5]. Vous ferez en sorte que cette fonction soit récursive terminale, ait pour complexité𝑂(𝑛)où𝑛est la longueur de la première liste, et vous justifierez sa correction et sa complexité.
4. En déduire une fonctionreverse : 'a list -> 'a listrenversant une liste. Votre fonction doit s’écrire en une ligne.1
5. Déduire de ce qui précède une fonctionappend : 'a list -> 'a list -> 'a listconca- ténant deux listes. Là encore, votre fonction doit tenir en une ligne.
Vérifiez que votre fonction fonctionne en calculant(reverse l l).
2 Énumération des entiers
Le but de cet exercice est de compter en décimal. Étant donné un entier𝑛, on représente l’entier 𝑐u�−1…𝑐0= ∑u�−1u�=0𝑐u�× 10u� par le tableau Caml[|𝑐0; …; 𝑐u�−1|].
1. Écrire une fonctionsuivant : int vect -> unitprenant en argument un tableau de 𝑛élé- ments représentant un entier 𝑁 et modifie ce tableau pour qu’il représente 𝑁 + 1 (il s’agit essentiellement d’ajouter1 au dernier chiffre, sauf lorsque ce dernier chiffre vaut9, auquel cas on le passe à 0 et on propage la retenue). Si l’entier était le maximum représentable sur 𝑛 chiffres,suivantlève l’exceptionExit(après avoir mis tous les chiffres du tableau à 0).
2. Montrer quesuivant, appliqué à un tableau de taille𝑛, a une complexité temporelle𝑂(𝑛).
3. Cette borne est-elle serrée ?
4. Écrire une fonction enumere prenant en argument un entier 𝑛, construisant un tableau 𝑡 de taille𝑛ne contenant que des0et appelantsuivantsur𝑡de façon répétée jusqu’à ce que celle-ci lève l’exceptionExit, auquel casenumerelève aussi l’exceptionExit.
1 Traditionnellement les lignes font 80 caractères mais il est de bon goût de ne pas en utiliser plus de 70.
2
5. Montrer queenumereappliquée à𝑛, s’exécute en temps𝑂(𝑛 × 10u�).
6. On peut essayer d’estimer plus finement la complexité desuivantetenumere. Pour cela, étant donné un tableau𝑡, on notera𝑐(𝑡)le nombre de chiffres que modifierait la fonction suivantsi on l’appliquait à𝑡. Montrer quesuivant, appliquée à un tableau𝑡, s’exécute en temps𝑂(𝑐(𝑡)).
7. On identifie l’ensemble des tableaux 𝑡 de taille 𝑛 contenant des chiffres décimaux à [[0, 10[[u�. Montrer
∑ 𝑡 ∈ [[0, 10[[u�𝑐(𝑡) = 109 10u�
8. En déduire pour enumere une borne de complexité strictement plus petite que celle donnée précédemment.