D'accord, cette question est un peu étrange, mais je me demandais si je pouvais le faire comme ça.Python - Modifier le dictionnaire de la fonction
Je travaille sur un simple générateur de nombres Fibonacci pour m'amuser puisque j'étais intéressé à le programmer. J'ai donc écrit ceci:
def f(n):
if n == 1: return 1
if n == 2: return 2
else:
return f(n-1) + f(n-2)
et couru très lentement, en prenant 15 secondes pour faire f(30)
sur mon ordinateur. Alors j'ai écrit ceci:
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
qui stocke essentiellement des résultats précédents dans un dictionnaire comme ceci:
{'f(1)':1,'f(2)':2,'f(3)':3,'f(4)':5}
et ainsi de suite. Dans la fonction, il vérifierait si ce résultat était dans ce dictionnaire, alors utilisez simplement cela au lieu d'avoir à refaire tous les calculs.
Cela l'a fait beaucoup plus rapide. Je pourrais faire f(100)
et il apparaît instantanément. En passant par intervalles de 500, je suis arrivé à f(4000)
et c'était encore instantané. Le seul problème était que le dictionnaire devenait stupidement grand.
J'ai donc ajouté a = {}
à la fin de la fonction, et cela n'a pas fonctionné; il a encore laissé a
comme dict massive.
fait donc ceci:
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
a = {}
ne fonctionne pas. mais si je fais ceci:
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
# now run the function
f(100)
a = {}
a
obtient remis à un dictionnaire vide. Pourquoi cela arrive-t-il et comment puis-je le réparer?
Ajout de a = {} juste avant le retour z? – Skycc
Pas de @Skycc qui ne fonctionne pas. Il se réinitialise chaque fois qu'il passe à travers le rendu de l'idée entière inutile. Ce que je veux faire est de réinitialiser le dictionnaire après la dernière récursion est appelée. – SolarPixelGaming
bizarre, son fonctionnement à mes côtés, "if" fib (% s) "% n dans un:" appellera récursivement, la partie else sera la dernière partie de récursion, return z quittera la fonction déjà – Skycc