2016-02-09 3 views
0

Я пишу программу, которая вычисляет идентификатор Pascal двух переменных, жестко закодированных в программе, поскольку я новичок в Python и пытаюсь кэшировать и хранить мемуары. Вот то, что я до сих пор:Использование мемуаров/Хранение кеша

counter = 0 

call_cacheK = {} 
    def callTest(n, k): 
    global counter 

    if n in call_cacheK: 
     return call_cacheK[n] 
    if k == 0: 
     return 1 
    elif k == n: 
     return 1 
    elif (1 <= k) and (k <= (n-1)): 
     counter += 1 
     #call_cacheK[n] = result 
     result = ((callTest(n-1, k) + callTest(n-1, k-1))) 
    print(result) 
    return result 

callTest(20, 11) 
#167,960 

Моя функция будет выводить окончательный реальный ответ с тем, что она имеет сейчас, но с большим количеством выводимых ответов. Кажется, я не понимаю, как правильно хранить значения, которые будут использоваться в кеше.

Как правильно использовать call_cacheK для хранения значений result, которые я уже использовал?

спасибо.

+1

Канонический метод memoization с декоратором, я предлагаю вам изучить это. Что касается этого, вы, похоже, не пытаетесь * вставить что-либо в кеш. – jonrsharpe

ответ

0

Посмотрим. Во-первых, вы имеете функцию двух переменных, но сохраняете результат в кеше только одним параметром. Таким образом, callTest(20, 11), callTest(20, 10), callTest(20, 9) будет иметь один результат в вашем кеше. Позволяет переписать функцию немного:

call_cacheK = {} 

def callTest(n, k): 
    if (n, k) in call_cacheK: 
     return call_cacheK[(n, k)] 
    if k == 0: 
     return 1 
    elif k == n: 
     return 1 
    elif (1 <= k) and (k <= (n-1)): 
     result = ((callTest(n-1, k) + callTest(n-1, k-1))) 
     call_cacheK[(n, k)] = result 
    print(result) 
    return result 

Да нет переменной счетчика, потому что я не понимаю, зачем вам это нужно :)

Кроме того, насколько я могу судить по использованию print(result) , вы, вероятно, используете Python3.x. Если да, то вы можете использовать standard cache implementing:

from functools import lru_cache 

@lru_cache(maxsize=None) 
def callTest2(n, k): 
    if k == 0: 
     return 1 
    elif k == n: 
     return 1 
    elif (1 <= k) and (k <= (n-1)): 
     result = ((callTest2(n-1, k) + callTest2(n-1, k-1))) 
    print(result) 
    return result 

Удачи! :)

+0

Спасибо. После того, как вы указали на проблему с одной переменной, становится ясной моя ошибка. Это было отличное решение проблемы. – Jeremy

+0

@ user3194722 Добро пожаловать :) Вы также можете отметить ответ как правильный, если он вам поможет. –

 Смежные вопросы

  • Нет связанных вопросов^_^