【问题标题】:How can I implement two memoization in one function?如何在一个函数中实现两个记忆?
【发布时间】:2015-09-05 12:09:05
【问题描述】:

我希望使用两个记忆字典来解决递归函数的问题,但我不确定如何执行这个想法。

据我所知,当只使用一个记忆字典时,代码结构看起来很相似。例如求解斐波那契数:

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]

我应该在代码中添加什么来使用两个记忆字典?我应该在def 行和递归调用中添加什么?

我的问题:

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

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

【问题讨论】:

  • 为什么要两个字典?
  • 你认为第二个 dict 会有什么改进?
  • 请注意,实现记忆的常规方法是使用 装饰器,您应该通过 identity - if mem is None 测试 None
  • 感谢您这么快回复。在我的问题中,我得到了两个限制因素,我尝试将它们分成 2 个不同的问题,并使用 minimum 函数获取其中一个返回值。
  • 如果您提供了一个实际问题的示例,然后显示minimal example您当前的代码并描述其中的问题,这可能会有所帮助。

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


【解决方案1】:

我无法理解您为什么要使用两个不同的字典,但我会使用装饰器

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)

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2010-10-12
    • 1970-01-01
    • 2013-06-14
    • 2020-04-19
    相关资源
    最近更新 更多