2015-11-10 1 views
6

Итак, я пытаюсь реализовать самую низкую общую подпоследовательность в Python и пытаюсь использовать эту альтернативу моему предыдущему решению. Я попытался использовать словарь вместо двухмерной матрицы, чтобы сохранить результаты.Воспоминание с использованием словаря в Python

def lcs(s1, s2): 

    cache = {} 
    if len(s1) == 0 or len(s2) == 0: 
     return 0 
    if (s1, s2) in cache: 
     return cache[s1, s2] 
    else: 
     if s1[-1] == s2[-1]: 
      cache[s1, s2] = 1 + lcs(s1[:-1], s2[:-1]) 
     else: 
      cache[s1, s2] = max(lcs(s1[:-1], s2), lcs(s1, s2[:-1])) 
    print cache 

Это возвращение

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' 

, который я понимаю, потому что я ничего так, как я могу сделать что-то вроде этого не возвращаются.

return cache[s1, s2] = 1 + lcs(s1[:-1], s2[:-1]) 

И я пытаюсь реализовать его без использования каких-либо декораторов.

+1

'cache' не могут быть локальными по отношению к функции, которую вы пытаетесь memoize –

+0

@JohnColeman Спасибо за указание на это. – Angersmash

ответ

2

Попробуйте

cache = {} 
def lcs(s1, s2): 
    global cache 
    if len(s1) == 0 or len(s2) == 0: 
     return 0 
    if (s1, s2) in cache: 
     return cache[(s1, s2)] 
    else: 
     if s1[-1] == s2[-1]: 
      cache[(s1, s2)] = 1 + lcs(s1[:-1], s2[:-1]) 
     else: 
      cache[(s1, s2)] = max(lcs(s1[:-1], s2), lcs(s1, s2[:-1])) 
    return cache[(s1, s2)] 
+0

Спасибо вам большое! Я пытался реализовать что-то подобное, и ваше решение сработало. Более интуитивно понятно, что создание 2-D матрицы для хранения результатов. – Angersmash

+0

Хорошо. Отметьте ответ как правильный ответ, чтобы другой мог воспользоваться этим. –