T.D. 3 La programmation récursive

Download Report

Transcript T.D. 3 La programmation récursive

T.D. 3
La programmation récursive
I - Les fonctions récursives
Exercice 1. (Logique) À l'aide d'une reconnaissance de motifs, écrire une fonction booléenne
imply a b.
Exercice 2. Écrire une fonction récursive somme x y qui calcule la somme de deux entiers naturels.
Exercice 3. (Puissance) Écrire une fonction récursive puissance_rec qui permet de calculer xn .
Vous déterminerez sa complexité en nombre de multiplications.
Exercice 4. (Fibonacci) Écrire une fonction récursive qui permette de calculer le terme général de
la suite de Fibonacci. Vous déterminerez sa complexité en nombre d'additions.
Exercice 5. (Euclide) Écrire une fonction récursive qui permet de calculer le pgcd de deux entiers.
Exercice 6. (Tours de Hanoï) On dispose de trois tiges sur lesquelles s'enlent des disques de tailles
diérentes. On dénit la contrainte suivante : sur chaque tige, on ne peut empiler un disque que
si son diamètre est plus petit que ceux des disques déjà empilés sur cette tige. Au départ, tous les
disques se trouvent sur la tige n°1. Il faut empiler les disques sur la tige n°3. Écrire une fonction
résolvant ce problème en langage naturel. Vous déterminerez sa complexité.
Exercice 7. (Tableaux)
1. Écrire une fonction est_croissant qui, étant donné un tableau, détermine si les nombres qu'il
contient sont classés par ordre croissant.
2. Écrire une fonction miroir qui inverse l'ordre des éléments d'un tableau.
Exercice 8. Transformer la fonction puissance récursive en une fonction récursive terminale.
II - Les preuves
Exercice 9. Écrire une fonction récursive somme n qui calcule la somme des n premiers entiers
naturels non nuls puis démontrer sa terminaison.
Exercice 10. (Fonction 47) Montrer la terminaison puis déterminer les valeurs retournées par la
fonction suivante.
let rec
match
|
f
n
(n ,
−>
( 0 ,_)
|
_
−>
f
with
p =
p)
(n
47
− 1)
( f
(n
− 1)
( p +7))
;;
Exercice 11. (Ackermann) La fonction Ackermann est célèbre en informatique pour la rapidité de
sa croissance. Montrer que cette fonction termine.
let rec
match
;;
with
ackermann
(n ,
|
0,
p
|
n,
0
|
n,
p
p)
−>
−>
−>
p +
n
p =
1
ackermann
(n
ackermann
(n
− 1)
− 1)
1
( ackermann
n
(p
−1))
T.D. 3. La programmation récursive
MPSI 1 & 2
Exercice 12. (MacCarty) Montrer la terminaison puis déterminer les valeurs retournées par la
fonction suivante.
let rec
if
else
f
then
n =
n >
100
f ( f
n
−10
;
( n+11))
;;
Exercice 13. (Morris)
let rec
match
morris
(a , b)
|
( 0 ,_)
|
(m, n )
−>
−>
with
a
b =
1
morris
− 1)
(m
( morris
m n)
;;
Cette fonction termine-t-elle ?
III - Les listes
Exercice 14. (Les éléments d’une liste) Écrire une fonction. . .
1. . . . head l qui renvoie l'élément de tête de la liste l.
2. . . . tail l qui renvoie la queue de la liste l.
3. . . . longueur l qui renvoie la longueur de la liste l.
4. . . . dernier_element l qui renvoie le dernier élément de la liste l.
5. . . . somme l qui renvoie la somme des éléments de la liste l.
Exercice 15. Écrire une fonction conc l1 l2 qui concatène les listes l1 et l2.
Exercice 16. (Hécatombes) Écrire une fonction. . .
1. . . . supprime l a qui supprime les occurences de l'élément a de la liste l.
2. . . . pair l qui renvoie les éléments d'indice pair de la liste l.
3. . . . decime l qui retourne la liste l où on a sélectionné un élément sur 3 en commençant par
le premier.
Exercice 17. Écrire une fonction mappe f l qui retourne une liste où la fonction f a été appliquée
à tous les éléments de l. (map en Caml-Light, List.map en Ocaml)
Exercice 18. (Arithmétique)
1. Écrire une fonction récursive diviseurs_premiers n qui renvoie la liste des diviseurs premiers
de l'entier naturel n.
2. Écrire une fonction base m qui retourne l'écriture binaire de m sous forme de liste.
Exercice 19. (Fonction mystère) Que fait la fonction suivante ?
let rec
let rec
match with
alice
l
=
insere_fin
a
l
=
l
|
[]
−> [ a ]
−> t
in
match with
|
t :: q
::
( insere_fin
a
q)
l
−> [ ]
−>
|
[]
|
t :: q
insere_fin
t
( alice
q)
;;
L •ycée Sˆta’nˆiŒs„laŒš
34
A. C€a’m€a’n€eš
T.D. 3. La programmation récursive
MPSI 1 & 2
IV - La dénition de types
Exercice 20. Dénir un type nombre qui regroupe les entiers et les ottants, puis dénir un
fonction add qui permet d'additionner deux nombres.
Exercice 21. Dénir le type ent modélisant les entiers naturels, construit à partir de Zero et de
l'application successeur S. Dénir l'addition de deux variables de types ent.
Exercice 22. Écrire une fonction qui permet de compter les points à la belote.
L •ycée Sˆta’nˆiŒs„laŒš
35
A. C€a’m€a’n€eš