2015-06-19 66 views
0

我想使用兩個memoization字典來解決遞歸函數的問題,但我不知道如何執行這個想法。如何在一個函數中實現兩個記憶?

從我所學到的,當只使用一個memoization dicionary時,代碼結構看起來很相似。例如,要解決斐波納契數字:

def fib_mem(n,mem=None): 
    if n < 2: 
     return n 
    if mem == None: 
     mem = {} 
    if n not in mem: 
     mem[n] = fib_mem(n-1,mem) + fib_mem(n-2,mem) 
    return mem[n] 

我應該添加到代碼中以使用兩個備忘錄dicitionaries?我應該添加到def行,並在遞歸調用?

我的問題:

list = [(16, 1, 4), (17, 2, 9), (3, 17, 10)]

list [i][0]是值。考慮到兩個限制因素,我應該得到最大可能的組合值:list[i][1]list[i][2]

+5

爲什麼要兩本字典? – Kevin

+1

你認爲第二個字典會有所改進嗎? – IanAuld

+1

請注意,實現memoization的傳統方式是使用**裝飾器**,並且您應該通過** identity ** - 如果mem是None來測試'None'。 – jonrsharpe

回答

0

我不能完全理解你爲什麼會想使用兩個不同的字典,但我會用一個裝飾

from functools import wraps 

def memoize_two_dict(func): 
    dict1 = {} 
    dict2 = {} 

    @wraps(func) 
    def wrapper(*args, use_dict1=True): 
     targs = tuple(args) 
     if use_dict1: 
      if targs not in dict1: 
       dict1[targs] = func(*args) 
      return dict1[targs] 
     else: 
      if targs not in dict2: 
       dict2[targs] = func(*args) 
      return dict2[targs] 
    return wrapper 

@memoize_two_dict 
def myfunction(args): 
    ... 

# Uses the two different dictionaries 
myfunction(1, use_dict1=False) 
myfunction(1) 
相關問題