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 :

Raisonnement par récursion


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Raisonnement par récursion
    Bonjour,

    J'ai beaucoup de mal à comprendre les raisonnements récursifs comme les tours de hanoi ou le triangle de sierpinski.

    Est ce qu'il existe une méthode ou une démarche générale pour pouvoir les résoudre ?

    Merci par avance.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Sujet difficile mais néanmoins important: la récursion permet sur certains sujet des solutions très élégantes!

    Voilà un petit exemple pour initier le sujet: l'affichage d'une structure arborescente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def parcours_arbre(arbre, niv=0):
        """affichage des éléments d'un arbre (liste de listes de listes...)
        """    
        for elem in arbre:
            if isinstance(elem, list):
                niv += 2
                parcours_arbre(elem, niv)
                niv -= 2
            else:
                print(" "*niv, elem)    
     
    L = [1, [2,3,[4,5],6,7],8,[9]]
    parcours_arbre(L)
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     1
       2
       3
         4
         5
       6
       7
     8
       9
    On voit bien que l'arbre a été parcouru complètement, et que l'indentation des éléments affichés est bien en rapport avec la "profondeur" de ces éléments.

    Pour le code, on voit bien à quel moment on ré-appelle la fonction dans laquelle on se trouve et pourquoi.

    Quelques tests sur ce code devraient déjà débroussailler le sujet.

    Il y a bien sûr des compléments pour résoudre des problèmes plus complexes! Voir par exemple https://fr.wikipedia.org/wiki/Algorithme_r%C3%A9cursif.

    Bon courage!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre réponse.
    Là où j'ai le plus de mal à comprendre la récursivité c'est quand on appelle plusieurs fois la fonction au sein de cette fonction. Je n'arrive pas à me représenter ce que fait chaque appel.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Mais c'est très facile avec Python de mettre des "print" dans le code pour voir l'évolution des données pendant l'exécution! C'est souvent comme ça qu'on peut comprendre le fonctionnement d'un algorithme compliqué.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    La démarche générale, pour la conception d'un algorithme récursif, est de se ramener à une ou plusieurs instances plus simple/plus petite du problème. On fait l'hypothèse qu'on possède déjà une solution pour résoudre la version plus simple, et à partir de là, on trouve un moyen d'étendre cette solution à une instance plus complexe. C'est une généralisation du principe mathématique de raisonnement par récurrence.

    Les tours de Hanoi sont un bon exemple car la solution récursive est particulière simple:

    On suppose qu'on a déjà une solution pour déplacer une tour de n disques sur un autre plot.
    Il est facile de l'étendre à n+1 disques:
    • on déplace les n premiers disques sur le plot intermédiaire (solution connue par hypothèse)
    • on déplace le dernier disque sur le plot final
    • on déplace à nouveau les n premiers disques sur le plot final (solution connue par hypothèse)

    Quelle est cette mystérieuse solution connue par hypothèse ? Et bien c'est la même, en soustrayant 1 de n (c'est l'appel récursif; il y en a deux ici).
    Evidemment, on ne peut réduire la taille du problème indéfiniment, il faut donc un case de base (parfois plusieurs) qui puisse être résolu directement.
    Ici on peut prendre le cas n = 0: s'il n'y a aucun disque a déplacer, la solution est donc trivialement de ne rien faire. On pourrait aussi s'arrêter à n = 1, la solution est presque aussi simple, c'est un autre choix possible pour le cas de base.

    Au niveau du codage, il faut ici réfléchir à ce qu'on a besoin de passer comme information à la fonction récursive; le rôle de chaque plot (départ/arrivée/intermédiaire) n'est pas fixe mais change à chaque appel récursif; il faut donc, d'une façon ou d'une autre, passer cette information.
    Par exemple:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def hanoi(n, depart, arrivee, inter):
        if n > 0:
            hanoi(n-1, depart, inter, arrivee)
            print("Déplacer le disque {n} de {depart} à {arrivee}".format(**locals()))
            hanoi(n-1, inter, arrivee, depart)

    Le principal avantage des solutions récursives, c'est qu'elles sont généralement simples et naturelles (quand on s'y est un minimum habitué). Cette simplicité fait que l'implémentation est souvent facile, le code est lisible, et les chances de faire une erreur sont limitées. Le principal désavantage est que l'utilisation de la pile les rendent souvent non optimales lorsqu'une solution itérative est possible, surtout dans des languages (comme Python) qui n'optimisent pas la récursion terminale.

Discussions similaires

  1. Soucis raisonnement par récurrence
    Par NiamorH dans le forum Mathématiques
    Réponses: 2
    Dernier message: 31/07/2009, 16h44
  2. Raisonnement par récurrence
    Par Bovino dans le forum Enigmes
    Réponses: 3
    Dernier message: 09/02/2009, 13h33
  3. Raisonnement par cas
    Par fouedovic dans le forum Langage
    Réponses: 7
    Dernier message: 16/04/2008, 21h16
  4. Raisonnement par l'absurde
    Par GO dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2007, 08h54
  5. Debuter en developpement Web par le RIA: est-ce raisonnable?
    Par pamplemousse_mk2 dans le forum Autres langages pour le Web
    Réponses: 1
    Dernier message: 02/01/2007, 14h17

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