4

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

Antwort

4

Der Grund m = Memoize(fibbo3) ist nicht die rekursive Verweise auf fibbo3 aus fibbo3 während fibbo3 = Memoize(fibbo3) Beeinflusst .

Sie können auch einen der memoizing decorators in der Python Decorator Library in Betracht ziehen.

+0

"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? –

+0

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

Verwandte Themen