2013-2014
Rcursivit
1
Exercices
1.1
Exercice 2-1
Question 1
Voici quelques lignes de code :
let fact n = 1
let fact n =
if n = 0 then
1
else
n * (fact (n - 1))
Quelle est la valeur de fact 10 ? Plus gnralement de fact n o n dsigne un entier quelconque ?
Voici la dclaration en
Question 1 Que pensez-vous des expressions calcules par chacune des deux fonctions dans les
deux cas de base et rcursif ?
Voici la dclaration en
La fonction de Mc Carthy
Voici la dclaration en
Question 1 Si n est un entier strictement suprieur 100, quelle est la valeur de mccarthy n ?
Question 2 Et pour 90 n 100 ?
Question 3 Et pour n 100 quelconque ?
1.2
Exercice 2-5
Exercice 2-7
Exercice 2-8
Algorithme d'Euclide
119
544
119
68
51
=
=
=
=
=
544
119
68
51
17
0 +
4 +
1 +
1 +
3 +
119
68
51
17
0
Le pgcd de 119 et 544 est le dernier reste non nul, c'estdire 17.
Le pgcd n'est pas dni lorsque les deux nombres sont nuls.
Question 1 Exprimez de manire rcursive cet algorithme. Vous pourrez supposer que les deux
entiers a et b sont positifs ou nuls, et que l'un au moins de ces deux entiers n'est pas nul.
Question 4 Modiez la programmation de votre fonction pgcd pour que les valeurs qu'elle renvoie
soient toujours positives.
Exercice 2-9
Coecient binomial
n
n!
Les coecients binomiaux sont dnis pour les entiers naturels n p 0 par
=
.
p
p!(n p)!
Une relation de rcurrence valable pour n > p > 0 est
n+1
n
n
=
+
p+1
p
p+1
Question 1 Ralisez une fonction eectuant un calcul rcursif des coecients binomiaux qui n'utilise
que l'addition des entiers.
Palindromes
Un palindrome est un mot dont les lettres lues de gauche droite sont les mmes que celles
Exercice 2-10
lues de droite gauche. Les mots radar, elle, t, ici sont des palindromes.
Question 1 Ralisez un prdicat qui teste si un mot est un palindrome. Pour cela vous pourrez
Question 1
Ralisez une fonction nb_occurrences de type
string char int
qui renvoie le nombre d'occurrences du caractre (second paramtre) dans la chane (premier
paramtre).
Par exemple
#
#
-
nb_occurrences "abcdebdb" z ;;
: int = 0
nb_occurrences "abcdebdb" b ;;
: int = 3
qui renvoie l'indice de la premire occurence du caractre (second paramtre) dans la chane
(premier paramtre) si le caractre est eectivement prsent,
et qui dclenche une exception Failure "indice caractere non trouve" : dans le cas contraire.
Cette fonction indice est une fonction qui fait partie du module String sous le nom index. Une
solution possible pour cette question est donc
let indice = String.index
mais ce n'est videmment pas ce qui est attendu. De plus, lorsque le caractre n'est pas prsent dans
la chane, la fonction String.index dclenche l'exception Not_found.
Exercice 2-12
permutation
Exercice 2-13
Dans cet exercice on considre des chanes de caractres dcrivant des sommes de nombres
entiers naturels. Ces chanes ne comprennent que des chires (caractres 0, 1, . . . , 9) et
le symboles usuel de l'addition +.
Ces chanes reprsentent donc soit un entier naturel, soit une somme d'entiers naturels. On
suppose de plus que cette chane est bien forme, c'estdire qu'elle reprsente eectivement
une somme d'entiers. On s'interdit donc des chanes de la forme "", "12+", "+12", "12++12", . . .
qui renvoie l'entier gal la somme reprsente par la chane passe en paramtre.
Par exemple
#
#
#
#
-
evalue_somme
: int = 123
evalue_somme
: int = 138
evalue_somme
: int = 139
evalue_somme
: int = 2139
"123" ;;
"123+15" ;;
"123+15+1" ;;
"123+15+1+2000" ;;
Vous pourrez utiliser avec prot les fonctions String.sub (cf exercice 10), String.index (cf
exercice 11) et int_of_string.
1.4
Exercice 2-14
Tracer un segment
En informatique graphique, tous les points ont des coordonnes entires. Soit donc deux points
A de coordonnes (xA , yA ) et B de coordonnes (xB , yB ). Proposez un algorithme rcursif pour
tracer l'cran le segment [A, B]. La commande primitive que vous utiliserez est la commande
plot x y qui dessine le pixel de coordonnes (x, y).
1.5
Exercice 2-15
Donnez une version rcursive du calcul de la somme des lments d'un tableau d'entiers.
Exercice 2-16
Inversion