Vous êtes sur la page 1sur 5

Univ.

Lille1 - Licence Informatique 2me anne

2013-2014

Algorithmes et Programmation Imprative 2

Rcursivit
1

Exercices

1.1

Gnralits sur les algorithmes rcursifs

Exercice 2-1

Que calcule fact ?

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 ?

Question 2 Voici maintenant une autre dclaration de la fonction fact :


let rec fact n =
if n = 0 then
1
else
n * fact n - 1

Que donne le calcule de fact 1 ?


Exercice 2-2

Que calculent les fonctions pair et impair ?

Voici la dclaration en

Caml de deux fonctions :

let rec pair n = if n = 0 then true else not (impair n)


and impair n = if n = 0 then false else not (pair n)

Question 1 Que pensez-vous des expressions calcules par chacune des deux fonctions dans les
deux cas de base et rcursif ?

Question 2 Tracez le calcul de l'expression pair 1.


Exercice 2-3

Encore la fonction pair

Voici la dclaration en

Caml de la fonction pair :

let rec pair n =


if n = 0 then true
else pair (n - 2)

Que pensez-vous de cette fonction ?


Exercice 2-4

La fonction de Mc Carthy

Voici la dclaration en

Caml d'une fonction rcursive :

let rec mccarthy n =


if n > 100 then n - 10
else mccarthy (mccarthy (n + 11))

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

Algorithmes rcursifs sur les nombres

Exercice 2-5

Somme de deux entiers

Question 1 Proposez un algorithme rcursif de calcul de la somme de deux entiers naturels a et b


en supposant que les seules oprations de base dont vous disposez sont
 l'ajout de 1 un entier a : a + 1
 le retrait de 1 un entier a : a 1
 et les comparaisons 0 d'un entier a : a = 0, a > 0 et a < 0.
Question 2 Comment tendre cette fonction aux entiers de signe quelconque ?
Exercice 2-6

Produit de deux entiers

Question 1 Proposez un algorithme rcursif de calcul du produit de deux entiers naturels a et b en


supposant que les seules oprations de base dont vous disposez sont
 la somme de deux entiers a et b : a + b
 le retrait de 1 un entier a : a 1
 et la comparaison 0 d'un entier a : a = 0.

Exercice 2-7

Puissance entire d'un nombre rel

Question 1 Proposez un algorithme rcursif de calcul de la puissance n-ime (n N) d'un nombre


rel a en supposant que les seules oprations de base dont vous disposez sont
 le produit de deux rels a et b : a b
 le retrait de 1 un entier a : a 1
 et la comparaison 0 d'un entier a : a = 0.

Exercice 2-8

Algorithme d'Euclide

L'algorithme d'Euclide permet de calculer le pgcd de deux nombres entiers, c'estdire le


plus grand entier positif divisant ces deux nombres, par des divisions successives.
Voici le droulement de cet algorithme pour le calcul du pgcd de a = 119 et b = 544

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 2 Codez cet algorithme en Caml en utilisant l'oprateur modulo.


Question 3 En sachant qu'en Caml l'expression a

mod b a une valeur ayant le mme signe que a,

quelle est la valeur de l'expression pgcd 119 (-544) ?

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.

Question 2 Tracez le calcul du coecient binomial pour n = 5 et p = 2.


1.3

Algorithmes rcursifs sur les chanes de caractres

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

utiliser la fonction String.sub de type


string int int string
qui permet d'extraire une sous-chane d'une chane (premier paramtre) partir d'un indice (second
paramtre) et d'une certaine longueur (troisime paramtre).
Exercice 2-11

Occurrences dans une chane

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

Vous pourrez utiliser avec prot la fonction String.sub

Question 2 Ralisez maintenant une fonction indice de type


string char int

 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

Permutations des caractres


Dans cette exercice, on appelle
d'une chane de caractres s toute chane de
mme longueur que s contenant les mmes caractres que s. Par exemple, la chane eadbc est
une permutation de la chane abcde.
Si la chane s a tous ses caractres distincts, il existe |s|! permutations de s.
On suppose dans la suite que s est une chane ayant tous ses caractres distincts. On suppose
numrotes de 0 |s|!1 les permutations de s ranges dans l'ordre lexicographique. Par exemple,
la chane eadbc est la permutation numro 100 de la chane abcde.
Ralisez un programme qui donne la permutation numro n d'une chane s. (Vous pourrez
supposer que les caractres de la chane s sont de gauche droite dans l'ordre lexicographique. Si
ce n'est pas le cas, l'ordre lexicographique des permutations sera induit par l'ordre des caractres
dans s.)

permutation

Exercice 2-13

valuation d'expressions arithmtiques simples

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", . . .

Question 1 Ralisez la fonction evalue_somme de type


string int

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

Algorithmes rcursifs gomtriques

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

Algorithmes rcursifs sur les tableaux

Exercice 2-15

Somme des lments d'un tableau

Donnez une version rcursive du calcul de la somme des lments d'un tableau d'entiers.
Exercice 2-16

Inversion

Donnez un algorithme rcursif de l'inversion de l'ordre des lments d'un tableau.