Transcript
  • 11

    Programmation en C++ sous LinuxMaster MSI, Automne 2012

    Prof Abdelaziz Bouroumi

    07. Fonctions rcursives

    Prof. Abdelaziz [email protected]

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

    2

    07. Fonctions rcursives

    07. Fonctions rcursives20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi

  • 233

    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" surlaquelle repose la PS.

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

    44

    Exemples simples

    1.// fact(n)=1*2**(n-1)*nunsigned long fact(unsigned short n) {unsigned long fact(unsigned short n) {return n

  • 35

    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 rcursivesC++ 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 rcursivesC++ sous Linux, Master MSI, 2013 A. Bouroumi20/01/2013

  • 47

    4 disques (au moins 15 dplacements)

    h // iki di / iki/I T f H i 4 if

    07. Fonctions rcursivesC++ 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

  • 599

    Rcursivit et rptitions

    Thoriquement, tout ce quon peut programmer laide dune structure itrative peut ltre moyennant la rcursivit t i tet 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

    1010

    Exemple des tours de Hano

    // Hano1, version rcursivevoid Hanoi1(int n, int a, int b, int c){if(n){Hanoi1(n-1 a c b);Hanoi1(n-1,a,c,b);cout

  • 61111

    Mauvaise rcursivit

    // testFibo.cpp (Janvier 2013)#include "masterTools.hpp" unsigned n;int main(int argc, char* argv[]) {// Programme paramtrif(argc!=2) {cout

  • 71313

    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

    1414

    Complexit de la fonction fibo

    Equation de rcurrence: La redondance des traitements suggre une

    )1()2()( += nTnTnTgg

    complexit exponentielle. En posant , lquation devient: Do:

    nnT =)( 12 += nnn 012 =

    + 51

    07. Fonctions rcursives

    ==

    =+=

    )(2

    51

    )(or d' nombre 2

    51

    2

    1

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

  • 81515

    Solution de lquation de rcurrence

    , avecnn BAnT 21)( += =+= 0)0( BAT 1BA

    =+=+

    0)1(0)0(

    21 BATBAT

    5== BA

    nnnnT 6.12

    512

    515

    1)(

    +=

    07. Fonctions rcursives

    Combien de temps faudrait-il pour calculer fibo(100) sur une machine qui ralise 109 oprations par seconde?

    T(100)=1.6100/109/60/60/24/30/12/100=83 sicles

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

    1616

    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 rcursives20/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

  • 91717

    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 rcursives20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi

    1818

    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)( TnTnT +=

    === ccteOT )1()1(cnTnTcnTnT 3)2(4)()2(2)1( +=+=cnTnTcnTnT 7)3(8)()3(2)2( +=+=cnTnTcnTnT 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

    cinTnT ii )12()(2)( +=ccTnT nn += 11 2)1(2)(

    )2()12()( nn OcnT ==

  • 10

    19

    Autre mthode de rsolution

    07. Fonctions rcursives20/01/2013 C++ sous Linux, Master MSI, 2013 A. Bouroumi

    2020

    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.

    annesanness 08.13812/30/24/60/60/22 3232 ==

    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


Recommended