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 :

Problème sur une fonction


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2021
    Messages : 52
    Points : 53
    Points
    53
    Par défaut Problème sur une fonction
    Bonjour tous le monde,

    je travaille sur le fourmi de Langton. Pour cela je dois utiliser les notions de classe et tkinter. J'ai programmé mais je bloque sur la fonction after.Pour créer une animation, je dois utiliser la fonction after qui est intégré sur tkinter. Mais lorsque j'invoque, il m demande de fournir direction, position et tableau. Alors que je lui fourni dans le main.

    Pouvez-vous me dire où se trouve ma faute?

    Merci tous

    tuba uba

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    f
    from  tkinter import *
    import random
     
    class fourmie(object):
     
        def __init__(self,longeur,largeur, cellule):
            self.longeur = longeur
            self.largeur = largeur
            self.cellule = cellule
            self.tableur2 = []
            self.root = Tk()
            self.cnv = Canvas(self.root, width = 100, height = 100,background = "yellow")
     
        def creation_tableau(self):
            for i in range(self.largeur):
                self.tableur2.append([])
                for j in range(self.longeur):
                    self.tableur2[i].append(0)
            return self.tableur2
     
        def place_de_formie(self): # place aléatoire de la fourmie 
            a = random.randint(2,100)
            b = random.randint(2,100)
            return a,b
     
        def matrice_1(self):
            print(self.tableur2)
     
        def dessiner_carre(self,cordonne_x, cordonne_y):
          x,y = cordonne_y*self.cellule, cordonne_x*self.cellule
          carre =self.cnv.create_rectangle((x,y),(x+self.cellule, y+self.cellule), fill = "red" , outline ='')
          return carre
     
     
        def ar(self, position_fourmie, direction_fourmie, tableau): # fonction qui permet de connaitre les information sur le fourmie 
            i,j = position_fourmie
     
            if tableau[i][j] == 0:
                if direction_fourmie == "N":
                    r = (i,j+1),"E"
                elif direction_forumie == "S":
                    r = (i,j-1), "W"
                elif direction_fourmie == "E":
                    r = (i+1, j), "S"
                elif direction_fourmie == "W":
                    r = (i-1,j),"N"
            else :
                if direction_forumie == "S":
                    r = (i,j+1),"E"
                elif direction_fourmie == "N":
                    r = (i,j-1), "W"
                elif direction_fourmie == "W":
                    r = (i+1,j), "S"
                elif direction_forumie == "E":
                    r = (i-1,j),"N"
            return r
     
     
     
        def dessine_tableau(self, position_fourmie, direction_fourmie, tableau):
            (i_indice, j_indice),direction = self.ar(position_fourmie, direction_fourmie, tableau)
            i,j = position_fourmie
     
            print(i)
            print(j)
            carre = tableau[i][j]
            if carre == 0:
                carre = self.dessiner_carre(i,j)
                tableau[i][j] = carre
            else :
                cnv.delete(carre)
                tableau[i][j] = 0
     
            return (i_indice,j_indice), direction        
     
     
     
        def deplacement(self, position_fourmie, direction_fourmie, tableau):
            i,j = position_fourmie
     
            if tableau[i][j] == 0:
                if direction_fourmie == "N":
                    r = (i,j+1),"E"
                elif direction_forumie == "S":
                    r = (i,j-1), "W"
                elif direction_fourmie == "E":
                    r = (i+1, j), "S"
                elif direction_fourmie == "W":
                    r = (i-1,j),"N"
            else :
                if direction_forumie == "S":
                    r = (i,j+1),"E"
                elif direction_fourmie == "N":
                    r = (i,j-1), "W"
                elif direction_fourmie == "W":
                    r = (i+1,j), "S"
                elif direction_forumie == "E":
                    r = (i-1,j),"N"
            return r
     
     
        def animation(self, position, direction,tableau):
            self.position,self.direction = self.ar(position,direction, tableau)
            self.root.after(1, self.animation)
            self.root.mainloop()
     
     
    if __name__=='__main__':
        valeur = fourmie(100,100,1)
        valeur.animation((12,15), "N", valeur.creation_tableau())
    erreur :
    Traceback (most recent call last):
    File "/usr/lib/python3.8/tkinter/__init__.py", line 1892, in __call__
    return self.func(*args)
    File "/usr/lib/python3.8/tkinter/__init__.py", line 814, in callit
    func(*args)
    TypeError: animation() missing 3 required positional arguments: 'position', 'direction', and 'tableau'

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 132
    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 : 11 132
    Points : 27 257
    Points
    27 257
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tuba uba Voir le message
    Alors que je lui fourni dans le main.
    Si c'était là le souci, tu aurais dans ton message une ligne en plus marquée "File <<ton_source.py>>, line 111, in main".
    Cette ligne n'y est pas, ce n'est donc pas le main qui est en faute.

    Citation Envoyé par tuba uba Voir le message
    Pouvez-vous me dire où se trouve ma faute?
    Dans ta méthode "animation" tu programmes une callback tk qui se rappelle elle-même self.root.after(1, self.animation).
    Quand la méthode "animation" sera appelée par tk, elle le sera sans ces paramètres dont elle a besoin.
    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]

  3. #3
    Membre éprouvé Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 747
    Points : 1 238
    Points
    1 238
    Par défaut
    Yeap !

    after(parent, ms, function, *args)

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2021
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Bonjour

    J'ai effectué les modification que vous m'avez suggéré , mais je n'arrive pas fixer le problème. Il y a un autre problème que apparaît alors que le nombre itération est très petit.

    Pouvez - vous me dire ou se trouve le problème ?

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    from  tkinter import *
    import random
     
    class fourmie(object):
     
        def __init__(self,longeur,largeur, cellule):
            self.longeur = longeur
            self.largeur = largeur
            self.cellule = cellule
            self.tableur2 = []
            self.root = Tk()
            self.cnv = Canvas(self.root, width = 100, height = 100,background = "yellow")
     
        def creation_tableau(self):
            for i in range(self.largeur):
                self.tableur2.append([])
                for j in range(self.longeur):
                    self.tableur2[i].append(0)
            return self.tableur2
     
        def place_de_formie(self): # place aléatoire de la fourmie 
            a = random.randint(2,100)
            b = random.randint(2,100)
            return a,b
     
        def matrice_1(self):
            print(self.tableur2)
     
        def dessiner_carre(self,cordonne_x, cordonne_y):
          x,y = cordonne_y*self.cellule, cordonne_x*self.cellule
          carre =self.cnv.create_rectangle((x,y),(x+self.cellule, y+self.cellule), fill = "red" , outline ='')
          return carre
     
     
        def ar(self, position_fourmie, direction_fourmie, tableau): # fonction qui permet de connaitre les information sur le fourmie 
            i,j = position_fourmie
     
            if tableau[i][j] == 0:
                if direction_fourmie == "N":
                    r = (i,j+1),"E"
                elif direction_forumie == "S":
                    r = (i,j-1), "W"
                elif direction_fourmie == "E":
                    r = (i+1, j), "S"
                elif direction_fourmie == "W":
                    r = (i-1,j),"N"
            else :
                if direction_forumie == "S":
                    r = (i,j+1),"E"
                elif direction_fourmie == "N":
                    r = (i,j-1), "W"
                elif direction_fourmie == "W":
                    r = (i+1,j), "S"
                elif direction_forumie == "E":
                    r = (i-1,j),"N"
            return r
     
     
     
        def dessine_tableau(self, position_fourmie, direction_fourmie, tableau):
            (i_indice, j_indice),direction = self.ar(position_fourmie, direction_fourmie, tableau)
            i,j = position_fourmie
     
            print(i)
            print(j)
            carre = tableau[i][j]
            if carre == 0:
                carre = self.dessiner_carre(i,j)
                tableau[i][j] = carre
            else :
                cnv.delete(carre)
                tableau[i][j] = 0
     
            return (i_indice,j_indice), direction        
     
     
     
        def deplacement(self, position_fourmie, direction_fourmie, tableau):
            i,j = position_fourmie
     
            if tableau[i][j] == 0:
                if direction_fourmie == "N":
                    r = (i,j+1),"E"
                elif direction_forumie == "S":
                    r = (i,j-1), "W"
                elif direction_fourmie == "E":
                    r = (i+1, j), "S"
                elif direction_fourmie == "W":
                    r = (i-1,j),"N"
            else :
                if direction_forumie == "S":
                    r = (i,j+1),"E"
                elif direction_fourmie == "N":
                    r = (i,j-1), "W"
                elif direction_fourmie == "W":
                    r = (i+1,j), "S"
                elif direction_forumie == "E":
                    r = (i-1,j),"N"
            return r
     
     
        def animation(self, position, direction,tableau):
            self.position,self.direction = self.ar(position,direction, tableau)
            self.root.after(10, self.animation(position,direction,tableau))
            self.root.mainloop()
     
     
    if __name__=='__main__':
        valeur = fourmie(100,100,1)
        valeur.animation((12,15), "N", valeur.creation_tableau())
    message d'erreur :
    raceback (most recent call last):
    File "fourmie.py", line 110, in <module>
    valeur.animation((12,15), "N", valeur.creation_tableau())
    File "fourmie.py", line 104, in animation
    self.root.after(10, self.animation(position,direction,tableau))
    File "fourmie.py", line 104, in animation
    self.root.after(10, self.animation(position,direction,tableau))
    File "fourmie.py", line 104, in animation
    self.root.after(10, self.animation(position,direction,tableau))
    [Previous line repeated 994 more times]
    File "fourmie.py", line 103, in animation
    self.position,self.direction = self.ar(position,direction, tableau)
    File "fourmie.py", line 38, in ar
    if tableau[i][j] == 0:
    RecursionError: maximum recursion depth exceeded in comparison

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 132
    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 : 11 132
    Points : 27 257
    Points
    27 257
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tuba uba Voir le message
    J'ai effectué les modification que vous m'avez suggéré , mais je n'arrive pas fixer le problème. Il y a un autre problème que apparaît alors que le nombre itération est très petit.
    Si c'est "un autre problème" alors c'est un AUTRE problème donc le problème initial est bel et bien fixé.

    Citation Envoyé par tuba uba Voir le message
    Pouvez - vous me dire ou se trouve le problème ?
    Pourquoi nous? Python te le dit déjà: tu as dépassé la pile de récursion maximale (pile permettant d'éviter une récursivité infinie)
    Et pourquoi cette récursivité infinie? Parce que tu n'as pas respecté le principe de base d'écriture d'une fonction récursive permettant d'écrire une fonction récursive correcte.
    Hé oui, en ligne 104 la fonction se rappelle elle-même avec exactement les mêmes paramètres que ceux qu'elle reçoit. Pourtant c'est bien écrit ici que la fonction doit s'appeler avec un argument différent de l’argument reçu (impératif sinon le nouvel appel étant identique à l’ancien, la fonction n’a aucun moyen de le différencier)

    Citation Envoyé par tuba uba Voir le message
    J'ai effectué les modification que vous m'avez suggéré
    En fait tu avais raison, c'est bel et bien le même problème. Mais c'est aussi (en fait surtout) parce que tu n'as pas effectué les modifications suggérées. Tu as effecuté des modifications cons. En effet, ni LeNarvalo ni moi n'avons écrit (ni même suggéré) que tu devais appeler la fonction dans after() !!!
    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]

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    19 924
    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 : 19 924
    Points : 34 473
    Points
    34 473
    Par défaut
    Citation Envoyé par tuba uba Voir le message
    Pouvez - vous me dire ou se trouve le problème ?
    Dans le passage d'arguments à la fonction qui sera appelée via after.
    Vous avez écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.root.after(10, self.animation(position,direction,tableau))
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            self.root.after(10, self.animation,position,direction,tableau)
    provoquant l'appel immédiat de la fonction comme si elle était récursive (avec l'erreur qui va avec).

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

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    juillet 2021
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2021
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Bon

    Je reviens vers vous. j'ai effectué des modifications. Je ne sais pas si c'est cela que vous m'avez suggéré. Mais à la ligne 103, je calcule la nouvelle position de la fourmi et je le stocke dans le self.direction et self.position. Puis je repasse dans la fonction ar pour qu'il recalcule la position de la fourmi. Mais ce que je ne comprend pas il m'indique que je dépasse le nombre itération pendant la compilation. dois-je mettre en place un système pour arrêter les itérations. Mais normalement, je dois voir la fenêtre thinker mais il n’apparaît pas. Je suis allé sur le internet, il me dit que quand je dépasse 1000 itération python m'indique cette erreur. Mais je dois faire au moins 10000 itérations pour conclure. Avez - vous des astuces à me conseiller ?

    Merci d'avance.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    from  tkinter import *
    import random
     
    class fourmie(object):
     
        def __init__(self,longeur,largeur, cellule):
            self.longeur = longeur
            self.largeur = largeur
            self.cellule = cellule
            self.tableur2 = []
            self.root = Tk()
            self.cnv = Canvas(self.root, width = 100, height = 100,background = "yellow")
     
        def creation_tableau(self):
            for i in range(self.largeur):
                self.tableur2.append([])
                for j in range(self.longeur):
                    self.tableur2[i].append(0)
            return self.tableur2
     
        def place_de_formie(self): # place aléatoire de la fourmie 
            a = random.randint(2,100)
            b = random.randint(2,100)
            return a,b
     
        def matrice_1(self):
            print(self.tableur2)
     
        def dessiner_carre(self,cordonne_x, cordonne_y):
          x,y = cordonne_y*self.cellule, cordonne_x*self.cellule
          carre =self.cnv.create_rectangle((x,y),(x+self.cellule, y+self.cellule), fill = "red" , outline ='')
          return carre
     
     
        def ar(self, position_fourmie, direction_fourmie, tableau): # fonction qui permet de connaitre les information sur le fourmie 
            i,j = position_fourmie
     
            if tableau[i][j] == 0:
                if direction_fourmie == "N":
                    r = (i,j+1),"E"
                elif direction_fourmie == "S":
                    r = (i,j-1), "W"
                elif direction_fourmie == "E":
                    r = (i+1, j), "S"
                elif direction_fourmie == "W":
                    r = (i-1,j),"N"
            else :
                if direction_fourmie == "S":
                    r = (i,j+1),"E"
                elif direction_fourmie == "N":
                    r = (i,j-1), "W"
                elif direction_fourmie == "W":
                    r = (i+1,j), "S"
                elif direction_fourmie == "E":
                    r = (i-1,j),"N"
            return r
     
     
     
        def dessine_tableau(self, position_fourmie, direction_fourmie, tableau):
            (i_indice, j_indice),direction = self.ar(position_fourmie, direction_fourmie, tableau)
            i,j = position_fourmie
     
            print(i)
            print(j)
            carre = tableau[i][j]
            if carre == 0:
                carre = self.dessiner_carre(i,j)
                tableau[i][j] = carre
            else :
                cnv.delete(carre)
                tableau[i][j] = 0
     
            return (i_indice,j_indice), direction        
     
     
     
        def deplacement(self, position_fourmie, direction_fourmie, tableau):
            i,j = position_fourmie
     
            if tableau[i][j] == 0:
                if direction_fourmie == "N":
                    r = (i,j+1),"E"
                elif direction_forumie == "S":
                    r = (i,j-1), "W"
                elif direction_fourmie == "E":
                    r = (i+1, j), "S"
                elif direction_fourmie == "W":
                    r = (i-1,j),"N"
            else :
                if direction_fourmie == "S":
                    r = (i,j+1),"E"
                elif direction_fourmie == "N":
                    r = (i,j-1), "W"
                elif direction_fourmie == "W":
                    r = (i+1,j), "S"
                elif direction_forumie == "E":
                    r = (i-1,j),"N"
            return r
     
     
        def animation(self, pos, direct,tableau):
            self.position,self.direction = self.ar(pos,direct, tableau)# modification effecuté 
            self.root.after(10, self.animation,self.position,self.direction,tableau)
            self.root.mainloop()
     
     
    if __name__=='__main__':
        valeur = fourmie(100,100,1)
        valeur.animation((12,15), "N", valeur.creation_tableau())
    erreur :
    Traceback (most recent call last):
    File "/usr/lib/python3.8/tkinter/__init__.py", line 1892, in __call__
    return self.func(*args)
    File "/usr/lib/python3.8/tkinter/__init__.py", line 814, in callit
    func(*args)
    File "fourmie.py", line 105, in animation
    self.root.mainloop()
    File "/usr/lib/python3.8/tkinter/__init__.py", line 1429, in mainloop
    self.tk.mainloop(n)
    File "/usr/lib/python3.8/tkinter/__init__.py", line 1896, in __call__
    self.widget._report_exception()
    File "/usr/lib/python3.8/tkinter/__init__.py", line 1612, in _report_exception
    root.report_callback_exception(exc, val, tb)
    File "/usr/lib/python3.8/tkinter/__init__.py", line 2345, in report_callback_exception
    import traceback
    File "/usr/lib/python3.8/traceback.py", line 5, in <module>
    import linecache
    File "/usr/lib/python3.8/linecache.py", line 11, in <module>
    import tokenize
    File "/usr/lib/python3.8/tokenize.py", line 45, in <module>
    class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')):
    File "/usr/lib/python3.8/collections/__init__.py", line 394, in namedtuple
    exec(s, namespace)
    RecursionError: maximum recursion depth exceeded during compilation

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 132
    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 : 11 132
    Points : 27 257
    Points
    27 257
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tuba uba Voir le message
    Je ne sais pas si c'est cela que vous m'avez suggéré.
    Ben... ce serait quand-même bien de le savoir...

    Citation Envoyé par tuba uba Voir le message
    Je suis allé sur le internet, il me dit que quand je dépasse 1000 itération python m'indique cette erreur. Mais je dois faire au moins 10000 itérations pour conclure. Avez - vous des astuces à me conseiller ?
    Oh, il est sympa le internet, il te raconte plein de choses. Toutefois tu confonds "itération" et "profondeur de récursion".
    Si j'écris for i in range(10000000): print(i) ça marchera nickel. Ce sera long, mais ça fera le job. Ca c'est une itération.
    La récursivité est le fait qu'une fonction ayant un travail de complexité C à effectuer, s'appelle elle-même en lui donnant un travail de complexité "C-1". L'exemple le plus utilisé est la factorielle ou n!=1*2*3*...*(n-1)*n. Ainsi, calculer facto(n) c'est prendre "n" et le multiplier par facto(n-1).
    Mais la récursivité implique que le moteur de calcul mette la fonction de complexité C en attente que celle de complexité C-1 ait fini. Et si C-1 n'est pas assez simple, alors celle-ci passe un travail C-2 à une 3° instance d'elle-même et se met en attente du résultat.
    Cela peut descendre (ici entre en compte la notion de profondeur) assez loin mais Python n'étant pas super puissant question calculs, la limite est fixée à 1000.

    Pour ta fourmi, il n'y a aucune raison d'utiliser la récursivité. A chaque étape, la fourmi regarde sa case, tourne en conséquence, change la couleur de la case et avance d'un cran. Et là l'étape est finie et tu affiches le terrain résultat. Pas de récursivité, juste une boucle.
    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]

  9. #9
    Membre éprouvé
    Avatar de Hominidé
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    juin 2018
    Messages
    743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juin 2018
    Messages : 743
    Points : 1 282
    Points
    1 282
    Billets dans le blog
    3
    Par défaut
    Bonjour,
    Il faut du temps pour apprendre comment on programme avec tkinter...
    Sinon pour ce qui est de la méthode after(), pas de soucis de récursion.
    La preuve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import tkinter as tk
     
    root = tk.Tk()
     
    def boucle(nbr = 10000):
        nbr -= 1
        if nbr:
            root.after(10, boucle, nbr)
        else:
            print('fini!')
    boucle()
    root.mainloop()
    note: avec nbr = 10000, ça prend du temps avant de voir affiché "fini!"
    pathlib, poetry, importlib_ressources...

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    19 924
    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 : 19 924
    Points : 34 473
    Points
    34 473
    Par défaut
    Salut,

    Citation Envoyé par tuba uba Voir le message
    Mais je dois faire au moins 10000 itérations pour conclure. Avez - vous des astuces à me conseiller ?
    Il n'y a pas "d'astuces", il suffit de relire le code que vous avez écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def animation(self, pos, direct,tableau):
            self.position,self.direction = self.ar(pos,direct, tableau)# modification effecuté 
            self.root.after(10, self.animation,self.position,self.direction,tableau)
            self.root.mainloop()
    A chaque appel à animation on relance animation 10ms plus tard et on appelle mainloop => l'appel à animation ne se termine pas...
    Quelques pouièmes de secondes plus tard, on a explosé la pile d'appels et Python râle RecursionError...

    Que cherchiez vous à faire en ajoutant un appel à mainloop à cet endroit? Mystère.
    Et ce soucis là corrigé, il y en a certainement d'autres.

    Côté astuces, ouvrir un tuto et apprendre les bases avant de se lancer dans un petit projet qui sera l'occasion de montrer qu'on sait utiliser ce qu'on a appris (ou le réviser)....
    Se jeter à l'eau et prier pour qu'on vous jette une bouée au cas où, c'est bon pour les cas désespérés pas lorsqu'on pianote derrière un clavier bien au chaud avec un accès Internet et beaucoup d'informations à portée de moteur de recherche.

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

Discussions similaires

  1. Problème sur une fonction logique
    Par Crack1986 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 16/03/2012, 17h51
  2. problème sur une Fonction récursive
    Par bernie74 dans le forum Développement
    Réponses: 4
    Dernier message: 21/11/2011, 13h45
  3. probléme sur une fonction
    Par titeufdev dans le forum PL/SQL
    Réponses: 3
    Dernier message: 11/01/2011, 10h36
  4. [String]Problème sur une fonction de récurrence
    Par hibou107 dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 13/04/2010, 16h53
  5. [PostgreSQL] [PostGreSQL] problème sur une fonction avec connexion
    Par roblescriso dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/06/2008, 19h03

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