You are on page 1of 10

1

1
Programmation en C++ sous Linux
Master MSI, Automne 2012
Prof Abdelaziz Bouroumi
07. Fonctions rcursives
Prof. Abdelaziz Bouroumi
a.bouroumi@gmail.com
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
2
07. Fonctions rcursives
07. Fonctions rcursives 20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
2
33
Rcursivit
Moyen simple et efficace de programmer, de faon lgante,
des tches quon peut successivement diviser en:
Une tche quon sait raliser (cas de base), et
Une ou plusieurs autres tches qui se dfinissent de la
mme faon que la tche initiale.
Une fonction rcursive est une fonction
qui sappelle elle-mme
07. Fonctions rcursives
qui s appelle elle-mme.
Cest un cas particulier dapplication de la
technique "diviser pour mieux rgner" sur
laquelle repose la PS.
C++ sous Linux, Master MSI, 2013 A. Bouroumi 20/01/2013
44
Exemples simples
1.
// fact(n)=1*2**(n-1)*n
unsigned long fact(unsigned short n) { unsigned long fact(unsigned short n) {
return n<=1?1:n*fact(n-1);
}
2.
// som(n)=1+2+3++n
07. Fonctions rcursives
// ( )
unsigned long som(unsigned int n) {
return n<2?n:n+som(n-1);
}
C++ sous Linux, Master MSI, 2013 A. Bouroumi 20/01/2013
3
5
Autre exemple classique
http://fr.wikipedia.org/wiki/Tours_de_Hano
Si n=1 dplacer le disque directement de A C;
i {
A B C
07. Fonctions rcursives C++ sous Linux, Master MSI, 2013 A. Bouroumi
Sinon {
dplacer n-1 disques de A B;
dplacer le disque restant de A C;
dplacer les n-1 disques de B C;
}
20/01/2013
6
Cas de 3 disques (7 dplacements)
07. Fonctions rcursives C++ sous Linux, Master MSI, 2013 A. Bouroumi 20/01/2013
4
7
4 disques (au moins 15 dplacements)
h // iki di / iki/I T f H i 4 if
07. Fonctions rcursives C++ sous Linux, Master MSI, 2013 A. Bouroumi
http://commons.wikimedia.org/wiki/Image:Tower_of_Hanoi_4.gif
20/01/2013
8
Fonctionnement des appels rcursifs
cout<<fact(4)
24
4*fact(3)
4*6
3*fact(2)
3*2
07. Fonctions rcursives C++ sous Linux, Master MSI, 2013 A. Bouroumi
2*fact(1)
2*1
return 1
20/01/2013
5
99
Rcursivit et rptitions
Thoriquement, tout ce quon peut programmer laide
dune structure itrative peut ltre moyennant la rcursivit
t i t et inversement.
Pratiquement, le choix entre la rcursivit et les structures
itratives doit tre fait en se basant sur des critres comme:
la complexit spatiale (mmoire) et temporelle (temps
dexcution) de lalgorithme,
l li ibilit t ll d d
07. Fonctions rcursives
la lisibilit et llgance du code,
lefficacit,
la facilit de maintenance.
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
10 10
Exemple des tours de Hano
// Hano1, version rcursive
void Hanoi1(int n, int a, int b, int c){
if(n){
Hanoi1(n-1 a c b); Hanoi1(n-1,a,c,b);
cout<<a<<"-->"<<c<<endl;
Hanoi1(n-1,b,a,c);
}
// Hanoi2, version itrative
void Hanoi2(int n, int a, int b, int c){
for(int x=1; x<(1<<n); x++) {
07. Fonctions rcursives
a=(x&x-1)%3;
c=((x|x-1)+1)%3;
cout<<a<<"-->"<<c<<endl;
}
}
C++ sous Linux, Master MSI, 2013 A. Bouroumi 20/01/2013
6
11 11
Mauvaise rcursivit
// testFibo.cpp (Janvier 2013)
#include "masterTools.hpp"
unsigned n;
int main(int argc, char* argv[]) {// Programme paramtr
if(argc!=2) {
cout<<argv[0]<<": erreur de syntax\n" ; exit(1);
}
n=atoi(argv[1]); // ASCII to integer
cout<<"fibo("<<n<<")="<<fibo(n);
return 0;
07. Fonctions rcursives
return 0;
}
unsigned fibo(unsigned n) {
return n<2?n:fibo(n-1)+fibo(n-2);
}
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
Sagit-il dune bonne
mthode de calcul de fibo(n)?
Pourquoi?
12
Redondance des traitements
f(5)
f(4) f(3)
f(3) f(2)
f(2) f(1)
f(2) f(1) f(1) f(0) f(1) f(0)
07. Fonctions rcursives
f(1) f(0)
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
Le calcul rcursif de fibo(n) est une trs
mauvaise mthode car il comporte des
traitements redondants.
7
13 13
Complexit de la fonction fibo
La complexit dun algorithme, ou du code qui
limplmente, se mesure par lordre de grandeur du
de la fonction T(n) qui traduit la variation du temps
dexcution T en fonction de la taille des donnes (ici
le nombre n).
Dans le cas dalgorithmes rcursifs, ce calcul
ncessite deux tapes: ltablissement puis la
07. Fonctions rcursives
ncessite deux tapes: l tablissement puis la
rsolution de lquation de rcurrence qui traduit la
faon dont lalgorithme utilise la technique diviser
pour rgner.
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
14 14
Complexit de la fonction fibo
Equation de rcurrence:
La redondance des traitements suggre une
) 1 ( ) 2 ( ) ( + = n T n T n T
gg
complexit exponentielle.
En posant , lquation devient:
Do:
n
n T = ) (
1 2
+ =
n n n

0 1
2
=

+ 5 1

07. Fonctions rcursives

=
=
+
=
) (
2
5 1
) ( or d' nombre
2
5 1
2
1


20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
8
15 15
Solution de lquation de rcurrence
, avec
n n
B A n T
2 1
) ( + =

= + = 0 ) 0 ( B A T
1
B A

= + =
+
0 ) 1 (
0 ) 0 (
2 1
B A T
B A T
5
= = B A
n
n n
n T 6 . 1
2
5 1
2
5 1
5
1
) (
(
(

|
|
.
|

\
|

|
|
.
|

\
|
+
=
07. Fonctions rcursives
Combien de temps faudrait-il pour calculer fibo(100) sur une
machine qui ralise 10
9
oprations par seconde?
T(100)=1.6
100
/10
9
/60/60/24/30/12/100=83 sicles
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
16 16
Programmation dynamique
Existe-t-il de mthode plus efficace pour calculer fibo(n)?
La programmation dynamique est une technique de conception
dalgorithmes qui vise sacrifier la mmoire pour gagner en
temps dexcution.
Pour cela, on mmorise les calculs intermdiaires au lieu de les
refaire.
unsigned int fibo2(int n) {
07. Fonctions rcursives 20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
unsigned int t[n]; t[0]=0; t[1]=1;
for(int i=2;i<=n;i++) t[i]=t[i-1]+t[i-2];
return(t[n]);
}
9
17 17
Exercice
Ecrire une version de la fonction fibo qui ne conserve
en RAM que les deux derniers termes calculs de la
suite de Fibonacci.
Ecrire un programme de test de cette fonction.
07. Fonctions rcursives 20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
18 18
Exemple des tours de Hano
Hanoi(n,a,c,b)=Hanoi(n-1,a,b,c)+Hanoi(1,a,c,b)+Hanoi(n-1,b,c,a)
Equation de rcurrence:
) 1 ( ) 1 ( 2 ) ( T n T n T + =

= = = c cte O T ) 1 ( ) 1 (
c n T n T c n T n T 3 ) 2 ( 4 ) ( ) 2 ( 2 ) 1 ( + = + =
c n T n T c n T n T 7 ) 3 ( 8 ) ( ) 3 ( 2 ) 2 ( + = + =
c n T n T c n T n T 15 ) 4 ( 16 ) ( ) 4 ( 2 ) 3 ( + = + =
07. Fonctions rcursives
Gnralisation:
Cas de base: n-i=1

20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi


c i n T n T
i i
) 1 2 ( ) ( 2 ) ( + =
c c T n T
n n
+ =
1 1
2 ) 1 ( 2 ) (
) 2 ( ) 1 2 ( ) (
n n
O c n T = =
10
19
Autre mthode de rsolution
07. Fonctions rcursives 20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi
20 20
Exercices
1. En supposant que chaque dplacement lmentaire de disque demande
une seconde, combien de temps faut-il pour dplacer 32 disques?
2. Calculer le temps qui nous spare de la fin du monde selon la lgende
des tours de Hano (lorsque 64 disques seront dplacs de la tour A
vers la tour C) en supposant que chaque dplacement demande une
seconde.
annes annes s 08 . 138 12 / 30 / 24 / 60 / 60 / 2 2
32 32
= =
07. Fonctions rcursives
3. Existe-t-il de mthode plus efficace pour rsoudre le problme des
tours de Hano?
4. Peut-on savoir sil est possible de trouver une mthode plus efficace?
20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi

You might also like