Sunteți pe pagina 1din 6

Chapitre 1

Rcursivit
1.1 Dnition
La rcursivit est un concept fondamental cl dans l'informatique, c'est
une mthode de rsolution de problme qui consiste rduire un problme
en sous-problmes de plus en plus petits jusqu' ce qu'on arrive un petit
problme assez simple qu'il peut tre rsolu trivialement. La rcursivit permet d'crire des solutions lgantes aux problmes qui pourraient autrement
tre trs dicile rsoudre.
En d'autres terme Un algorithme est dit rcursif s'il s'appelle lui-mme,
LISP et Algol 60 ont t les premiers langages de programmation qui ont
introduit la rcursivit et maintenant tous les langages de programmation
modernes proposent une implmentation de la rcursivit.
La rcursivit c'est l'application de l'adage  Diviser pour rgner 
l'algorithmique : pour rsoudre un problme d'une taille donne, on scinde
ce problme en plusieurs sous-problmes plus petits, on recommence avec
chacun de ces sous-problmes jusqu' ce que tous les petits sous-...-sousproblmes soient facilement rsolubles.
En gnral, les programmes informatiques rcursives ncessitent plus de
mmoire et de calcul par rapport aux algorithmes itratifs, mais ils sont plus
simples et dans de nombreux cas un moyen naturel de rchir au problme.

Exemple Calcul de la somme dans un tableau


On commence par un simple problme qu'on essai de rsoudre la mthode classique que tous les tudiants connaissent. Supposant qu'on veut
calculer le factoriel d'un nombre. La solution itrative qui calcul le factoriel
utilise une variable ( fact ) pour accumuler la valeur de chaque nombre moins,
1

en commenant par le premier.

Algorithm 1 Solution itrative du factoriel


function factoriel(n : integer) :integer
fact : integer ;
sum 1 ;
for i 1 to n do
f act f act i ;
end for
f actoriel f act ;
end function
Supposant maintenant que nous ne pouvons pas utiliser de boucle pour,
ou rpter la question qui se pose : Comment calculer le factoriel d'un
nombre ? (exemple f actoriel(6) En mathmatique, on peut commencer par
rappeler que le factoriel est une fonction qui est dnie pour deux paramtres,
le premier est le nombre lui mme et le deuxime le factoriel du nombre
moins un. Pour rednir le problme de factoriel au produit, on peut rcrire
le factoriel comme une expression entre parenthses. Une telle expression
ressemble ceci :
tant que

f actoriel(6) = (1 (2 (3 (4 (5 6))))

On peut rcrire cette expression d'une autre faon :


f actoriel(6) = (6 (5 (4 (3 (2 1)))))
m
f actoriel(6) = (6 f actoriel(5))
f actoriel(6) = (6 5 f actoriel(4))
f actoriel(6) = (6 5 4 f actoriel(3))
f actoriel(6) = (6 5 4 3 f actoriel(2))
f actoriel(6) = (6 5 4 3 2f actoriel(1))

Donc le problme a t rduit un simple produit sachant que le factoriel


de 1 est gale 1. Notant que c'est un problme qu'on peut rsoudre sans
boucle ou instructions spciales. En fait, on peut utiliser cette squence de
simplications pour calculer le factoriel nale.
Comment peut-on prendre cette ide et la transformer en algorithmique ?
Tout d'abord, on va reformuler le problme de factoriel en termes d'algorithme. On peut dire que le factoriel d'un nombre peut tre le produit entre
2

Algorithm 2 Solution rcursive du factoriel


1: function factoriel(n : integer ): integer
2:
if n = 1 then
3:
4:
5:
6:
7:

f actoriel 1

else

f actoriel n f actoriel(n 1)

end if
end function

nombre mme et le factoriel du nombre moins un. Pour le dire sous une forme
fonctionnelle : F actoriel(n) = n f actoriel(n 1) Le code de la fonction
factoriel deviendra comme suit :
Il y a quelques ides cls dans ce code qu'on peut voir. Tout d'abord,
sur la ligne 2, on vrie si le nombre est gale un. Cette vrication est
cruciale et essentielle pour sortir de la fonction. Le factoriel de 1 est trivial ;
la fonction retourne 1. Deuximement, sur la ligne 5 la fonction fonction
factoriel s'appelle elle mme ! pour cette raison on appel la fonction factorielle
rcursive. Une fonction rcursive est une fonction qui s'appelle elle mme. La
gure 1.1 montre la srie d'appels rcursifs qui sont ncessaires pour calculer
le factoriel. Cette srie d'appels est vue comme une srie de simplications.
Chaque fois qu'on fait un appel rcursif on rsout un problme plus petit,
jusqu' ce qu'on atteigne le point o le problme ne peut pas devenir plus
petit.
Lorsqu'on atteint le point o le problme est aussi simple que cela peut
l'tre, on commence reconstituer les solutions de chacun des petits problmes jusqu' ce que le problme initial est rsolu. La gure 1.1 montre les
produits qui sont eectues que la fonction factoriel travaille son chemin vers
l'arrire dans la srie d'appels. Lorsque factoriel revient au plus haut, on a
la solution l'ensemble du problme.

1.2 Les trois rgles de la rcursivit


Pour une meilleur utilisation de la rcursivit en algorithmique et en programmation, les algorithmes rcursifs doivent obir trois lois importantes :
1. Un algorithme rcursif doit avoir un cas de base.
2. Un algorithme rcursif doit changer son tat et de progresser vers le
cas de base.
3

factoriel(4)

factoriel (3)

4x

factoriel (2)

3x

factoriel (1)

2x

factoriel (0)

1x

Figure 1.1  Sries d'appels rcursifs f actoriel(4)


3. Un algorithme rcursif doit se appeler, de manire rcursive.
Vriant chacun de ces lois plus en dtail et voir comment il a t utilis
dans l'algorithme de factoriel. Tout d'abord, un cas de base est la condition
qui permet l'algorithme pour arrter rcursivit. Un scnario de base est
typiquement un problme qui est assez petit pour rsoudre directement. Dans
l'algorithme du factoriel le cas de base est le factoriel de 1 qui gale 1.
Pour obir la deuxime loi, on devra prendre des dispositions pour un
changement d'tat qui se dplace vers le cas de base. Un changement d'tat
signie que certaines donnes que l'algorithme utilise est modi. Habituellement les donnes que reprsente notre problme devient de plus en plus
petit. Dans l'algorithme de factoriel la structure de donnes primaire est une
fonction, donc on devra se concentrer sur le changement d'tat. Depuis le cas
de base qui est gale 1, une progression naturelle vers le scnario de base
est de raccourcir la fonction. C'est exactement ce qui se passe sur la ligne 5
de 1 lorsqu'on appel factoriel avec le nombre suivant (n 1).
La troisime rgle est que l'algorithme doit s'appeler lui mme. C'est
la mme dnition de la rcursivit. La rcursivit est un concept droutant pour de nombreux programmeurs dbutants. En tant que programmeur novice, vous avez appris que les fonctions sont bon parce que vous
pouvez prendre un grand problme et le rduire en petits problmes (sousproblmes). Les sous-problmes peuvent tre rsolus en crivant une fonction
4

24

factoriel(4)

4x 6

factoriel (3)

3x2

factoriel (2)

factoriel (1)

factoriel (0)

2x1

1x1

Figure 1.2  Sries de retours rcursifs f actoriel(4) par produit


pour rsoudre chaque problme. Nous avons un problme rsoudre avec
une fonction, mais cette fonction rsout le problme en se faisant appeler !
Mais la logique n'est pas circulaire du tout ; la logique de la rcursivit est
une expression lgante de rsoudre un problme en le dcomposant en des
problmes plus petits et plus faciles rsoudre.

1.3 Solution rcursive vs itrative


Pour mettre en uvre des algorithmes rcursifs ncessite le plus souvent une pile. Vue la dicult d'implanter cette pile qui a fait dire pendant
longtemps que les programmes rcursifs taient moins ecaces que les programmes itratifs, mais la situation a chang. En fait, le dbat sur le choix
entre la rcursivit ou l'itratif est aussi vieux que l'informatique et les progrs des compilateurs rduit encore la dirence d'ecacit. Voici quelques
arguments en faveur de la rcursivit :
 La rcursion permet de prsenter simplement des algorithmes beaucoup plus astucieux (et donc plus ecaces) (exemple l'algorithme de
tri rapide).
 Les compilateurs d'aujourd'hui sont tellement astucieux que plus le
programme leur est prsent de faon abstraite et sans eets de bord,
plus ils peuvent mettre en uvre leurs optimisations et aboutir des
codes objets ecaces.
5

 Des structures de donnes rcursives, comme par exemple les quadtrees,


ont t conues pour leur ecacit. On ne voit pas comment on pourrait
excuter sur elles des algorithmes non rcursifs.

1.4 Structure de donnes rcursive


Une structure de donne rcursive S est une structure qui se compose elle
mme d'une structure de donne S ou si l'un de ses composantes est une
structure de donne faisant appel S. Parmi structure de donnes rcursives
vont tre expos dans les prochains chapitres, nous verrons les listes, les piles,
les le et les arbres.

Exercices
Suite de Fibonacci
La suite de Fibonacci est une suite d'entiers (un )n > 0 dnit par :

u0 = 0
u1 = 1

un = un1 + un2 \ n > 2

 Vrier que cette suite vrie bien les rgles de la rcursivit.


 crire la fonction f ib qui calcul le nime terme f ib(n) de faon itrative puis
rcursive.
 Tracer b(4), Combien d'appel rcursive gnre t'il ? Combien au max
d'appels imbriqus ?
 L'algorithme est-il terminal ? Justiez la rponse.

S-ar putea să vă placă și