Ich bin neu in Algorithmen und so wurde ich mit mehreren Möglichkeiten der Algorithmen zu experimentieren, speziell Memoisationmemoization nicht wie erwartet funktioniert
Ich habe eine einfache Fibonacci-Reihe rekursive Funktion Memoisation
class Memoize:
def __init__(self, f):
self.f = f
self.memo = {}
def __call__(self, *args):
if not args in self.memo:
self.memo[args] = self.f(*args)
print args
print self.memo
return self.memo[args]
def fibbo3(n):
if n==1:
return 1
elif n==0:
return 0
else:
return fibbo3(n-1) + fibbo3(n-2)
m = Memoize(fibbo3)
m(4)
print "check the memo"
print m.memo
(4,)
{(4,): 3}
check the memo
{(4,): 3}
Aber wenn ich mit Anruf
fibbo3 = Memoize(fibbo3)
fibbo3(4)
print 'ckeck the memo'
fibbo3.memo
(1,)
{(1,): 1}
(0,)
{(0,): 0, (1,): 1}
(2,)
{(2,): 1, (0,): 0, (1,): 1}
{(2,): 1, (0,): 0, (1,): 1}
(3,)
{(2,): 1, (0,): 0, (3,): 2, (1,): 1}
{(2,): 1, (0,): 0, (3,): 2, (1,): 1}
(4,)
{(2,): 1, (0,): 0, (3,): 2, (1,): 1, (4,): 3}
ckeck the memo
Out[524]:
{(0,): 0, (1,): 1, (2,): 1, (3,): 2, (4,): 3}
Ich sehe das gesamte Memoised Wörterbuch. Warum wird die Änderung des Namens der Variablen von ‚m‘ auf ‚fibbo3‘ (dh der Name der Funktion) führt zu einem solchen Verhalten
"Der Grund ist, dass m = Memoize (fibbo3) die rekursiven Verweise auf fibbo3 aus fibbo3 nicht beeinflusst, während fibbo3 = Memoize (fibbo3) tut" ............ Könnten Sie bitte sagen. Warum passiert es so? –
Da in der Funktion fibbo3, weiß es nicht, dass Sie später Memoize werden. Sie können diese Zeile als "return Memoize (fibbo3 (n-1)) + Memorize (fibbo3 (n-2))" umschreiben – sureshvv