IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comprendre un exemple


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Par défaut Comprendre un exemple
    Bonjour à tous,

    je lis actuellement le livre "Plonger au cœur de python" >LIEN< et cet exemple m'interroge (expl 2.6).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def fib(n):
        print ('n =', n)
        if n > 1:
            return n * fib(n - 1)
        else:
            print ('end of the line')
            return 1
    ###    
    if __name__ == "__main__":
    fib(5)
     
     
    """   voici le resultat
    >>> 
    n = 5
    n = 4
    n = 3
    n = 2
    n = 1
    end of the line
    >>> 
    """
    Je ne comprends pas le fonctionnement du n * dans return n * fib(n - 1)
    return fib(n - 1) fonctionne de la même manière. (C'est à dire que return déclenche à nouveau l'utilisation de fib(). )
    comment fonctionne return n * fib(n - 1) ?

    Pouvez-vous m’éclairer ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par marven Voir le message
    comment fonctionne return n * fib(n - 1)
    çà retourne juste le produit de "n" avec le retour de la fonction fib appelée avec n-1.
    La multiplication vous connaissez?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Par défaut
    Je connais la multiplication, merci.
    Mais pourquoi n*fip(n - 1) retourne la même chose que fip(n - 1) ? Sans multiplication.

    (Cet exemple n'a peu-être pas d'application réelle, c'est juste pour montrer un mécanisme de fonction pour le livre ?)

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tout d'abord pourquoi fib() ? Dans les cours il s'agit généralement d'une fonction retournant la suite de Fibonnaci.

    Ton exemple est une fonction récursive (qui s'appelle elle-même) et si tu avais ajouté un dernier print tu aurais vu ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    >>> def fact(n):
    ...     print('n = ', n)
    ...     if n > 1:
    ...             return n * fact(n - 1)
    ...     else:
    ...             return n
    ... 
    >>> print(fact(5))
    n =  5
    n =  4
    n =  3
    n =  2
    n =  1
    120
    C'est donc la factorielle de 5

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 19
    Par défaut
    Merci beaucoup pour ta super réponse VinsS.

    Je crois mieux comprendre : que n dans fact(5) prend la valeur de n-1 à chaque boucle (tant que n>1). Tandis que fact(5), lui-même étant un type (int), prends la valeur du produit de n * fact(n-1) à chaque boucle jusqu'à n>1 aussi.
    Donc une factorielle.

    C'est un peu comme une variable qui se calculerait elle-même.

    a = 12 + fact(5)
    print(a)
    >>> 132

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marven Voir le message
    C'est un peu comme une variable qui se calculerait elle-même.
    Bonjour

    C'est le principe connu sous le nom de "récursivité". Ca permet à une fonction de s'appeler elle-même. L'appel se rebranche sur la même fonction mais dans un contexte différent. Et ensuite il attent la fin de ce sous-niveau pour continuer son calcul.
    Mais si ce sous-niveau se réappelle lui-même, alors lui aussi génèrera un sous-sous niveau de travail et devra attendre la fin de ce 3° niveau avant de lui-même se terminer (tandis que le premier niveau attend toujours). Et etc.

    L'exemple général qui illustre bien cette notion est effectivement le calcul de la factorielle où calculer fact(5) revient à calculer 5 * fact(4) ; mais où aussi calculer fact(4) revient à calculer 4 * fact(3). Et etc.

    Un autre exemple est souvent montré avec la suite de Fibonacci où U1 et U2 sont fixés (généralement à 1 et 1) et ensuite quel que soit n, Un=U(n-2) + U(n-1). Ainsi calculer U(5) revient à calculer U(4) + U(3) ; mais calculer U(4) revient à calculer d'abord U(3) + U(2) et U(3) c'est U(2) + U(1). Et etc. Au final la suite donne 1, 1, 2, 3, 5 et donc U(5)=5.
    D'où la confusion citée par Vins où tu as écrit "fib" en montrant un calcul de factorielle.

    Accessoirement l'exemple de Fibonacci est surtout montré pour exposer le danger de la récursivité qui est peut-être simple à écrire (fib(x)=fib(x-2) + fib(x-1)) mais qui génére derrière une charge considérable pour l'ordi qui va calculer et recalculer inutilement certains termes un grand nombre de fois.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comprendre l'exemple "Video Shader Effects"
    Par htakkk dans le forum Qt Quick
    Réponses: 2
    Dernier message: 11/04/2017, 13h45
  2. [WXMDIClientWindowBase] Comprendre l'exemple de base
    Par gabrielS dans le forum wxWidgets
    Réponses: 1
    Dernier message: 22/07/2013, 21h48
  3. Comprendre un exemple
    Par cedji dans le forum LabVIEW
    Réponses: 0
    Dernier message: 05/07/2010, 10h45
  4. [Thread] aide pour comprendre un exemple
    Par maminova77 dans le forum 2D
    Réponses: 2
    Dernier message: 19/04/2006, 23h24
  5. [Exemple]Mieux comprendre Primary/Foreign Key - Cardinalités
    Par tarzanchita dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 07/04/2006, 08h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo