J'ai un problème avec mon code, ça me renvoi << AttributeError: 'NoneType' object has no attribute 'append' >>, ça viens de la ligne 7. J'ai l'impression que "solution", qui est une liste, change de type mais je ne vois pas pourquoi.
Merci d'avance pour votre aide
pieces = [100,50,20,10,5,2,1]
def rendu_glouton(arendre, solution=[], i=0):
if arendre == 0:
return solution
p = pieces[i]
if p <= arendre:
return rendu_glouton(arendre-p, solution.append(p), i)
else :
return rendu_glouton(arendre, solution, i+1)
J'ai un problème avec mon code, ça me renvoi << AttributeError: 'NoneType' object has no attribute 'append' >>, ça viens de la ligne 7. J'ai l'impression que "solution", qui est une liste, change de type mais je ne vois pas pourquoi.
Merci d'avance pour votre aide
pieces = [100,50,20,10,5,2,1]
def rendu_glouton(arendre, solution=[], i=0):
if arendre == 0:
return solution
p = pieces[i]
if p <= arendre:
return rendu_glouton(arendre-p, solution.append(p), i)
else :
return rendu_glouton(arendre, solution, i+1)
sans doute parce que solution.append(p) vaut None. Et c'est une mauvaise idée que de donner un mutable comme valeur par défaut à un paramètre.
pour le dire d'une autre façon, solution.append(p) ne renvoie pas une liste, ça renvoie None; hors toi, tu veux passer la liste solution, donc faire le append avant le return
Merci pour vos réponses, en fait le code vient d'un sujet que j'ai eu à faire ce matin dans lequel il manque des morceaux de code qu'il faut compléter.
J'aurais bien aimé mettre solution+[p] mais ce n'est pas possible et j'essaie de trouver la solution mais je ne trouve pas.
def rendu_glouton(arendre, solution=[], i=0):
if arendre == 0:
return ...
p = pieces[i]
if p <= ...:
return rendu_glouton(arendre-p, solution.append(...), i)
else :
return rendu_glouton(arendre, solution, ...)
Rien n'empêche d'indiquer que le code est faux et va générer une erreur sauf dans les cas décrits par PascalOrtiz et de proposer la version qui fonctionne dans tous les cas.
Rien n'empêche d'indiquer que le code est faux et va générer une erreur sauf dans les cas décrits par PascalOrtiz et de proposer la version qui fonctionne dans tous les cas.
Il y a aussi le problème de l'argument par défaut qui entraîne le problème bien connu suivant :
pieces = [100,50,20,10,5,2,1]
def rendu_glouton(arendre, solution=[], i=0):
if arendre == 0:
return solution
p = pieces[i]
if p <= arendre:
solution.append(p)
return rendu_glouton(arendre-p, solution, i)
else :
return rendu_glouton(arendre, solution, i+1)
solution=[]
rendu_glouton(42, solution)
rendu_glouton(142, solution)
print(solution)
[20, 20, 2, 100, 20, 20, 2]
donc la réponse est fausse. Et en fait ce paramètre par défaut ne sert à rien car si on ne l'écrit pas on ne peut pas accéder aux solutions. Donc on pourrait écrire
def rendu_glouton(arendre, solution, i=0):
if arendre == 0:
return solution
p = pieces[i]
if p <= arendre:
solution.append(p)
return rendu_glouton(arendre-p, solution, i)
else :
return rendu_glouton(arendre, solution, i+1)
solution=[]
rendu_glouton(42, solution)
solution=[]
rendu_glouton(142, solution)
print(solution)
mais qui n'est pas terrible non plus car on est obligé à chaque fois de poser solution = [].
Une meilleure solution serait que la fonction se charge de créer les solutions :
pieces = [100,50,20,10,5,2,1]
def rendu_glouton(arendre, i):
if arendre == 0:
return []
p = pieces[i]
if p <= arendre:
return [p]+rendu_glouton(arendre-p, i)
else :
return rendu_glouton(arendre, i+1)
print(all(arendre== sum(rendu_glouton(arendre,0)) for arendre in range(110)))
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
Le Tout est souvent plus grand que la somme de ses parties.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères