2015-06-19 2 views
0

Я хочу решить проблему с рекурсивной функцией, используя два словаря memoization, но я не уверен, как выполнить эту идею.Как я могу реализовать две 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) 
    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 является ** декоратор **, и вы должны проверить 'None' на ** identity ** -' if mem is 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)