Vous êtes sur la page 1sur 12

Fonctions rcursives (5.

1)

Rcursivit

Il est parfois difficile de dfinir un objet


Il est parfois plus simple de dfinir cet objet
en fonction de lui-mme

Ce procd sappelle la rcursivit


On peut utiliser la rcursivit pour dfinir
des ensembles, des suites, des fonctions

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Rcursion en programmation
Quand une mthode (fonction) sappelle elle-mme
Un exemple classique: La fonction factorielle
n! = 1 2 3

(n 1) n

Dfinition rcursive:
!
1
si n = 0
f (n) =
n f (n 1) sinon

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

lments essentiels dune mthode rcursive


Un (ou plusieurs) cas de base
Les valeurs dentres pour lesquelles on ne fait aucun
appel rcursif sont appeles les cas de base

Appels rcursifs
Appels de la mthode courante
Chaque suite dappels rcursifs doit essentiellement
se terminer sur un cas de base

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Trace dune rcursion


Une bote pour chaque appel
rcursif
Une flche pour chaque appel

Une flche pour chaque retour


dune valeur

appel

FactoRcur(4)
4

Retourner 4*6=24

Retourner 3*2=6

appel

FactoRcur(3)
3
Retourner 2*1=2

appel

appel

FactoRcur(2)
2
Retourner 1*1=1

FactoRcur(1)
1

appel

Retourner 1

FactoRcur(0)

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Un autre exemple de rcursion linaire


Algorithme SommeLinaire(A,n)
Entres: Une liste dentiers A et un entier
n >=1, tel que A contient au moins n lments
Sortie: La somme des n premiers entiers de A

Si n=1 alors
retourner A[0]
Sinon
retourner SommeLinaire(A,n-1)+ A[n-1]

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Bien dfinir la rcursion


Lorsquon cre des mthodes rcursives, il est
important de les dfinir de faon faciliter la
rcursion
Cela implique parfois quil faut donner des
paramtres additionels en entre la mthode
Pour dfinir une fonction rcursive qui inverse les
lments dune liste, il est plus facile de dfinir une
mthode InverseListe(A,i,j) qui prend en entre deux
indices i et j en plus de la liste a inverser.

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Inverser les lments dune liste


Algorithme InverseListe(A,i,j)
Entres: Une liste dentiers A et des indices i et j
Sortie: La liste ayant les lments de lindice i j
dans lordre inverse

Si i < j alors
changer A[i] et A[j]
InverseListe(A,i+1,j-1)
Retourner A

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Tail recursion
Lorsquune mthode rcursive excute son appel
rcursif comme dernire tape

La mthode InverseListe en est un exemple

Ces mthodes peuvent facilement tre converties en


des mthodes non rcursives (ce qui sauve de
lespace mmoire)

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

Rcursion Binaire
Quand une mthode fait deux appels rcursifs
Exemple:
Algorithme SommeBinaire(A,i,n)
Entres: Une liste dentiers A et des entiers i et n
Sortie: La somme de n entiers dans A, o lon
commence additionner partir de lindice i

Si n = 1 alors
retourner A[i]
Sinon
retourner SommeBinaire[A,i,n/2] +
SommeBinaire[A,i+n/2,n/2]
IFT2810, A2009, Sylvie Hamel
Universit de Montral

Fonctions rcursives

Calculer les nombres de Fibonacci


Les nombres de Fibonacci sont dfinis rcursivement

F0 = 0
F1 = 1
Fi = Fi1 + Fi2

pour i > 1

Les calculer avec un algorithme rcursif (essai 1)


Algorithme FibBinaire(k)
Entres: Une entier k >= 0
Sortie: Fk

Si k = 0 ou 1 alors
retourner k
sinon
retourner FibBinaire(k-1) + FibBinaire(k-2)
IFT2810, A2009, Sylvie Hamel
Universit de Montral

Fonctions rcursives

10

Un meilleur algorithme
Algorithme FibLineaire(k)
Entres: Une entier k >= 0
Sortie: (Fk , Fk1)

Si k = 1 alors
retourner (k,0)
sinon
(i,j) := FibLinaire(k-1)
retourner (i+j, i)
Complexit en temps: O(k)

IFT2810, A2009, Sylvie Hamel


Universit de Montral

Fonctions rcursives

11