• Aucun résultat trouvé

Option Informatique MP/MP*, Exercices Judicaël Courant 12 septembre 2015 1 Listes

N/A
N/A
Protected

Academic year: 2022

Partager "Option Informatique MP/MP*, Exercices Judicaël Courant 12 septembre 2015 1 Listes"

Copied!
2
0
0

Texte intégral

(1)

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)

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.

Références

Documents relatifs

Judicaël Courant - 13 septembre 2017 1/2 Document sous licence Art Libre ( http://artlibre.org).. Écrire une fonction booléenne nommée est_divisible, qui prend en argument un

Écrire une fonction inverse(s) prenant en argument la représentation d’une

— Il existe un moyen de convaincre quelqu’un qu’une formule est satisfiable en lui donnant un certificat (de taille polynomiale en la taille de la formule), qu’il peut vérifier

Écrire une fonction size : 'a abr -> int de complexité constante retournant la

5 Il y a une erreur dans l’énoncé : il faut aussi le graphe en second argument de la fonction check_tags_predecessors qui a donc pour type task -> graph

Modifier ce main pour que l’utilisateur puisse donner les dimensions de la fenêtre en ligne de com- mande.. Ajouter une méthode qui dessine un segment de droite horizontal (trouver

Exercice 7 : Écrire un programme nombre_palindrome qui renvoie True si un nombre entier est un palindrome en base 10 et False sinon.. (Exemple : 1534351 est un palindrome car

I) On donne g(x, y) = (x 2 −y)(3x 2 −y) ; montrer que g(x, λx) admet un minimum local en 0.. donner le montant exact sans retour de monnaie) avec des jetons distincts.. On prend