Chapitre 4 Programmation impérative. Aspects impératifs de Caml .

publicité
Lycée Victor Hugo MPSI 2016-2017
Option informatique
Chapitre 4
Programmation impérative. Aspects impératifs de
I
Caml
.
Il faut avoir des références...
I.1
Échanges
1. Dénir une fonction swap de type 'a ref -> 'a ref -> unit qui permute le contenu de deux
références de même type.
2. Déterminer le type et le rôle de la fonction suivante :
1 let f x y =
2
x := !x + ! y ;
3
y := !x - ! y ;
4
x := !x - ! y ;;
Qu'en pensez-vous ?
I.2
Fibonacci
Dénir une fonction fibonacci qui calcule le n-ième terme de la suite de Fibonacci dans
un style impératif.
II
Travail sur les tableaux et les chaînes de caractères
II.1
Palindrome
Un palindrome est une chaîne de caractères qui peut être lue indiéremment de gauche à
droite ou de droite à gauche en conservant le même sens. À titre d'exemple, on peut citer :
eluparcettecrapule (élu par cette crapule) ;
tulastropecrasecesarceportsalut (tu l'as trop écrasé, César, ce Port Salut).
L'objectif de cet exercice est d'écrire deux versions d'une fonction palindrome , de type
string -> bool , testant si une chaîne de caractères est un palindrome.
La première version devra être écrite dans un style impératif :
un mot a0 · · · an−1 est un palindrome si et seulement si a0 = an−1 , a1 = an−2 , etc...
La seconde version sera écrite dans un style fonctionnel :
un mot a0 · · · an−1 de longueur supérieure ou égale à 2 est un palindrome si et seulement
si a0 = an−1 et si a1 · · · an−2 est un palindrome.
II.2
Parcours récursifs de tableaux
Pour chacun des algorithmes suivants, donnez leur complexité en fonction de la longueur du
tableau et une preuve de correction.
1. Décrivez un algorithme de paramètre un tableau de nombres qui donne la plus grande
valeur de ce tableau.
2. Décrivez un algorithme de paramètre un tableau t et un objet x qui donne le nombre
d'occurrences de x dans le tableau t .
1
Lycée Victor Hugo MPSI 2016-2017
Option informatique
3. Décrivez un algorithme de paramètre un tableau t et un objet x qui donne la première
position de x dans t si elle existe, sinon -1 .
III
D'après ESIM 2003. Tranches minimales d'un tableau
Soit V = (v0 ; v1 ; · · · ; vn ) un tableau dont les éléments sont des entiers relatifs indexés
de 0 à n. Une tranche T de V est une suite non vide d'éléments consécutifs de V , i.e. T =
(vj ; vj+1 ; · · · ; vk ) , avec 0 6 j 6 k 6 n.
On note alors T = V (j..k) et E l'ensemble des tranches de V .
À toute tranche T = V (j..k) de V on associe la somme S(T ) des éléments qui la composent
, soit : S(T ) = vj + vj+1 + · · · + vk .
Une tranche T de V est dite minimale si la somme qui lui est associée est minimale. Il peut
ne pas y avoir unicité.
Le but de cet exercice est de comparer divers algorithmes qui permettent de trouver une
tranche minimale T = V (d..f ) = min{S(t), t ∈ E}.
1. Approche brutale...
1-a Écrire une fonction : tranche_min1 de type int vect -> int qui prend pour argument
un tableau V et qui renvoie pour résultat la somme S(T ) associée à une tranche minimale T par exploration exhaustive de toutes les tranches. On aura intérêt pour alléger
la lecture du code à écrire une fonction somme v i j dont le rôle est immédiat...
1-b Déterminer en fonction de n, le nombre d'additions et de comparaisons eectuées suite
à l'appel de la fonction tranche_min1 .
2. Une approche plus subtile... Soit le schéma suivant :
Précisons la situation décrite par ce schéma : en supposant que toutes les composantes
entre 0 et i ont été examinées, la tranche de somme minimale (en ne considérant que les
éléments d'indices compris entre 0 et i) commence en d, se termine en f et a pour somme
smin . Par ailleurs, parmi toutes les tranches qui s'achèvent en i, il en existe (au moins) une
de somme minimale, on suppose qu'elle commence en k et a pour somme s.
2-a Après incrémentation de i (i → i + 1), quelles sont les deux seules valeurs à envisager,
pour déterminer parmi toutes les tranches qui s'achèvent en i, celle qui est de somme
minimale.
2-b En déduire un algorithme permettant de trouver une tranche de somme minimale T
du tableau V . Cet algorithme doit déterminer les indices d et f qui délimite la tranche
minimale T , ainsi que smin = S(T ) la somme qui lui est associée.
2-c Écrire la fonction : tranche_min2 de type int vect -> int -> int -> int correspondant
à cet algorithme.
2-d Déterminer en fonction de n, le nombre d'additions et de comparaisons eectuées suite
à l'appel de la fonction tranche_min2.
IV
IV.1
Tri
Tri par sélection récursif
1. Écrire une fonction récursive indice_max de paramètre un tableau de nombres t qui
donne l'indice de la plus grande valeur de ce tableau.
2
Lycée Victor Hugo MPSI 2016-2017
Option informatique
2. Écrire une fonction (non récursive) extraire de paramètres un tableau t et un indice
k qui donne un tableau contenant les mêmes éléments que ceux de t , à l'exception de
t[k] , dans le même ordre.
3. Écrire une fonction tri_selection récursive de paramètre un tableau de nombres t ,
qui construit un tableau ayant les mêmes éléments que ceux de t , rangés dans l'ordre
croissant.
V
L'exercice à rendre de la semaine : crible d'Ératosthène
1. Écrire la fonction eratosthene de type int -> bool vect qui, pour un entier n donné (n >
2), renvoie un tableau de taille n de booleens informant si l'indice i est un nombre premier.
On utilisera bien sûr l'algorithme d'Ératosthène 1 pour ce faire.
Par exemple :
1 eratosthene 10 ;;
2 - : bool vect = [|false; false; true; true; false; true; false; true;
false; false|]
2. Écrire alors une phrase
Caml qui permet d'acher les nombres premiers inférieurs à 100.
1. et on consultera son cours de mathématique ou d'informatique commune pour en avoir la description
3
Téléchargement