Vous êtes sur la page 1sur 2

TD N°1 Algorithmique & SDD

Exercice 1
2
1. Ecrire une fonction récursive qui calcule le carré d'un entier n = n x n:
Fonction carré (n : Entier) : Entier
2 2
On pourra utiliser la relation suivante : (n + 1) = n + 2n + 1.

2. Ecrire une fonction récursive qui calcule la somme de 1 à un entier n : 1+2+3 +…….+ (n-1)+n:
Fonction somme_recursif (n : Entier) : Entier

Exercice 2
Ecrire une fonction récursive qui prend en argument une chaîne de caractères et qui renvoie un booléen
indiquant s'il s'agit d'un palindrome ou non.

Exercice 3
On rappelle que les nombres de Fibonacci sont définis de la façon suivante :

F0 = F1 = 1
Fn = Fn-1 + Fn-2 pour n ≥ 2

1. Calculer F2; F3; F4 et F5.


2. Ecrire une fonction récursive qui calcule le nième nombre de Fibonacci.
3. Est-il possible d'écrire une fonction itérative (c'est-à-dire sans appel récursif) qui calcule la même chose ?

Rappel
Utilisation de l’itération
Un avantage important de l’itération est l’efficacité. Un programme qui utilise des boucles décrit
précisément chaque action à réaliser - ce style de programmation est appelé impératif ou
procédural.
Le code compilé d’un tel programme est une image assez fidèle des actions décrites par le
programme, traduites en code machine. Les choses sont différentes pour un programme récursif.
Conclusion : si on recherche l’efficacité (une exécution rapide) et le programme peut être écrit
sans trop de difficultés en style itératif, on préférera l’itération.
Utilisation de la récursivité
L’avantage de la récursivité est qu’elle se situe à un niveau d’abstraction supérieur par rapport à
l’itération. Une solution récursive décrit comment calculer la solution à partir d’un cas plus simple
– ce style de programmation est appelé déclaratif. Au lieu de préciser chaque action à réaliser, on
décrit ce qu’on veut obtenir - c’est ensuite au système de réaliser les actions nécessaires pour
obtenir le résultat demandé.
Souvent la solution récursive d’un problème est plus intuitive que celle itérative et le programme
à écrire est plus court et plus lisible. Néanmoins, quelqu’un habitué aux boucles et au style
impératif peut avoir des difficultés à utiliser la récursivité, car elle correspond à un type de
raisonnement particulier.
Le style déclaratif produit souvent du code moins efficace, car entre le programme descriptif et le
code compilé il y a un espace d’interprétation rempli par le système, difficile à optimiser dans
tous les cas. Cependant, les langages déclaratifs offrent un confort nettement supérieur au
programmeur.
Dans le cas précis de la récursivité, celle-ci est moins efficace que l’itération, car la répétition est
réalisée par des appels successifs de fonctions, ce qui est plus lent que l’incrémentation d’un
compteur de boucle.
Dans les langages (comme Java) qui offrent à la fois l’itération et la récursivité, on va préférer la
récursivité surtout dans les situations où la solution itérative est difficile à obtenir, par exemple :
– si les structures de données manipulées sont récursives (ex. les arbres).
– si le raisonnement lui même est recursif.

Mr. Guezouli L. Page 1 sur 2


TD N°1 Algorithmique & SDD

Exercice 4
On définit la fonction suivante :
Fonction McCarthy(n : Entier) : Entier
Debut
Si (n>100)
Alors Renvoyer(n-10)
Sinon Renvoyer(McCarthy(McCarthy(n+11)))
FinSi
Fin
1. Quelle est la valeur de McCarthy(n) pour n > 100 ?
2. Calculer McCarthy(98), McCarthy(99) et McCarthy(100).
3. En déduire la valeur de McCarthy(n) pour n - 100. Expliquer.

Exercice 5
Ecrire une procédure récursive qui représente le déplacement d’un cavalier sur un échiquier à partir de la
position (X0, Y0).

Y0+2 Position possible


Y0+1

Y0 Position du Cavalier
Y0-1

Y0-2
X0-2 X0-1 X0 X0+1 X0+2 X0-2 X0-2 X0-2

Exercice 6
T1 le robot se trouve à l’entrée Nord-Ouest d’un damier rectangulaire de N x M cases. Il doit sortir par la sortie
Sud-Est en descendant vers le Sud et en allant vers l’Est. Il a le choix à chaque pas (un pas = une case) entre :
descendre verticalement ; aller en diagonale ; ou se déplacer horizontalement vers l’Est. Il y a un sac d’or sur
chaque case, dont la valeur est lisible depuis la position initiale de T1. Le but de T1 est de ramasser le plus d’or
possible durant son trajet.
On veut écrire en pseudo-code, un algorithme Robot-cupide(x, y) qui, étant donnés le damier et les
coordonnées x et y d’une case, rend la quantité maximum d’or (gain) que peut ramasser le robot en se
déplaçant du coin Nord-Ouest jusqu’à cette case.

A B
C D

1. Considérons quatre cases du damier comme ci-dessus et supposons que l’on connaisse le gain maximum du
robot pour les cases A, B et C, quel sera le gain maximum pour la case D?
2. Écrire l’algorithme.
3. Si le robot se déplace d’un coin à l’autre d’un damier carré 4x4 combien de fois l’algorithme calcule t-il le
gain maximum sur la deuxième case de la diagonale ? Plus généralement, lors du calcul du gain maximum sur la
case x, y combien y a-t’il d’appels au calcul du gain maximum d’une case i, j (i ≤ x, j ≤ y).

Mr. Guezouli L. Page 2 sur 2