2015-06-19 35 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) 
相关问题