如何在一个函数中实现两个memoization?

时间:2015-06-19 13:23:53

标签: python python-2.7 python-3.x memoization

我希望使用两个memoization词典来解决递归函数的问题,但我不知道如何执行这个想法。

据我所知,当只使用一个memoization dicionary时,代码结构看起来很相似。例如,要解决Fibonacci数:

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]

我应该在代码中添加两个memoization dicitionaries?我应该在def行和递归调用中添加什么内容?

我的问题:

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

list [i][0]是值。考虑到两个限制因素,我应该得到最大可能的组合值:list[i][1]list[i][2]

1 个答案:

答案 0 :(得分: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)