Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一个功能中实现两个备忘录?_Python_Python 2.7_Python 3.x_Memoization - Fatal编程技术网

Python 如何在一个功能中实现两个备忘录?

Python 如何在一个功能中实现两个备忘录?,python,python-2.7,python-3.x,memoization,Python,Python 2.7,Python 3.x,Memoization,我希望使用两个记忆词典解决递归函数的问题,但我不确定如何执行这个想法 据我所知,当只使用一个记忆词典时,代码结构看起来很相似。例如,要求解斐波那契数: 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)

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

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

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 fib_mem(n,mem=None):
如果n<2:
返回n
如果mem==无:
mem={}
如果n不在mem中:
mem[n]=fib_mem(n-1,mem)+fib_mem(n-2,mem)
返回内存[n]
我应该在代码中添加什么来使用两个记忆化选项?我应该在
def
行和递归调用中添加什么

我的问题是:

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


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

我不明白为什么您要使用两个不同的字典,但我会使用一个装饰器

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)

你为什么想要两本词典?你认为第二本词典会有什么改进?请注意,实现记忆化的传统方法是使用修饰符,如果mem为None,你应该通过标识测试
None
。谢谢你这么快回复。在我的问题中,我得到了两个限制因素,我尝试将其分为两个不同的问题,并通过使用最小值函数得到其中一个返回值。如果您提供了一个实际问题的示例,然后显示当前代码并描述其问题,可能会有所帮助。