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 :

L-système et récursivité


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 6
    Par défaut L-système et récursivité
    Bonjour,

    Je dois coder un L-système afin de dessiner un triangle de Sierpisky. J'ai pour cela écris une première fonction apply_rule(S) avec les règles de transformation (A devient B-A-B etc...). Je dois maintenant écrire une fonction apply_rec(S,n) qui applique plusieurs fois apply_rule(S) au résultat précédent en partant de S sans utiliser de boucle, uniquement par récursivité. Voici mon code :
    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
    def apply_rules(S):
        S = ("A", "B")
        newS = ""
        for i in S:
            if i == "A":
                newS += "B-A-B"
            if i == "B":
                newS += "A+B+A"
            else:
                newS += ""
        return  newS
     
    def apply_rec(S,n):
        newS = ""
        if n == 0:
           return S
        else:
           newS = newS + apply_rules(S)
        return newS
    apply_rec("A", 1) doit par exemple donner "B-A-B".

    Ma fonction def apply_rec(S,n) ne marche pas, je vous demande donc un conseil sur comment faire pour appliquer n fois ma fonction au résultat précédent ?
    Merci de votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Par défaut
    Bonjour,

    Il te faudra à minima faire varier ton indice 'n' et, s'agissant de récursivité, ta méthode 'apply_rec' doit s'appeler elle-même avec les valeurs de l'execution précédante.
    Sans donner de solution toute faite, tu devrais obtenir quelque chose s'approchant de çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    apply_rec(apply_rules(S), n-1)

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ta fonction apply_rec part d'une liste S. Là 2 cas de figures :
    1) Ta liste ne contient qu'un seul élément -> Tu teste si c'est A ou B et tu renvoie ce qu'il faut
    2) Ta liste contient N élément. Dans ce cas tu prends le premier élément, tu le traites en fonction de A ou B, et tu dis que le résultat, c'est le résultat de ce premier élément que tu as transformer accolé au résultat de apply_rec(S[1:])

    Exemple à la con, pour calculer la somme des éléments d'une liste.

    Observe bien comment c'est construit, et adapte à ton problème.
    Option 1 : Avec une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def sum1(liste):
         result = 0
         for element in liste :
             result += element
         return result
     
    print(sum1([1,2,3,4]))
    Option2 : Avec la récursivité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def sum2(liste):
           if len(liste)==1 : 
                   return liste[0]
           else : 
                   return liste[0]+sum2(liste[1:])
     
    print(sum2([1,2,3,4]))

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 6
    Par défaut
    Voici mon code pour le dessin du triangle de Sierpinski, la dernière fonction ne marche pas, car apparement je ne parcours par la liste caractère par caractère ... c'est bien ça l'erreur ? :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    import turtle
    turtle.speed(0)
     
    turtle.penup()
    turtle.setx(-turtle.window_width()*0.45)
    turtle.sety(-turtle.window_height()*0.45)
    turtle.pendown()
     
    def apply_rules(S):
        S = ("A", "B")
        newS = ""
        for i in S:
            if i == "A":
                newS += "B-A-B"
            if i == "B":
                newS += "A+B+A"
            else:
                newS += ""
        return newS
     
    def apply_rec(S,n):
        if n == 0:
            return S
        else:
            return n*(apply_rules(S), n-1)
     
     
    def draw(S, length):
        for i in [S]:
            if [i] == "A" or "B":
                turtle.forward(length)
            elif [i] == ["+"]:
                turtle.right(60)
            elif [i] == ["-"]:
                turtle.left(60)
        return draw(S,length)
     
     
     
     
    S = apply_rec("B", 8)
    draw(S, 2)
    turtle.getcanvas().postscript(files="l_system.eps")
    turtle.done()

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Regarde mieux mon exemple de fonction récursive. La function sum2 s'appelle elle même. Là ta fonction apply_rec ne s'appelle pas elle même ... donc elle n'est pas récursive.

Discussions similaires

  1. Récursivité dans un système "monnayeur"
    Par TiteFleur dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 17/10/2006, 18h47
  2. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  3. [Système] Récursivité et itération
    Par Floréal dans le forum Langage
    Réponses: 8
    Dernier message: 19/04/2005, 14h57
  4. [Système] Vider le Presse Papier
    Par babe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/09/2002, 17h46
  5. IA avec le système de note
    Par scorpiwolf dans le forum C
    Réponses: 4
    Dernier message: 06/05/2002, 12h13

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