2014-01-20 2 views
0

Я закодировал функцию, которая находит все изменения n, используя данные монеты, когда заказ производит изменение.Python - изменение на Memoization

def find_change(n, coins): 
    if n < 0: 
     return [] 

    if n == 0: 
     return [[]] 

    all_changes = [] 

    for last_used_coin in coins: 
     curr_changes = find_change(n - last_used_coin, coins) 

     for change in curr_changes: 
      change.append(last_used_coin) 

     all_changes.extend(curr_changes) 

    return all_changes 

print find_change(4, [1,2,3]) 

Код, указанный выше, является «нормальным», и теперь я хочу его снова закодировать, но как памятку. Значения, которые будут сохранены в заметке, изменяются, поэтому я должен использовать метод deepcopy, но я не знаю, как его использовать. Может ли кто-нибудь показать мне, как?

EDIT: идея, как использовать DeepCopy:

from copy import deepcopy 
lst1 =[[1], [2]] 
lst 2 = deepcopy(lst1) 
print lst 

и мы получаем:

[[1], [2], [3]] 
+0

Ваш код не исполняется, разместите рабочую версию этой функции. Во-первых, 'find_changes' - это опечатка, но функция не выполняет выполнение. Также отправьте рабочий пример использования этой функции. –

+0

Надежда теперь лучше – user3210483

+0

Спасибо, например, код еще не исполняется –

ответ

2

Ваш изменения только аргумент n, поэтому просто использовать его в качестве ключа для таблицы поиска:

if n not in cache: 
    ... 

Вы даже можете превратить его в декоратор :

def memoized(function): 
    cache = {} 

    def inner(n, coins): 
     if n not in cache: 
      cache[n] = function(n, coins) 

     return cache[n] 

    return inner 

@memoized 
def find_change(n, coins): 
    ... 
+0

Прежде всего, большое спасибо. Но, я бы очень хотел использовать deepcopy, я попытался понять, как это работает и как сделать этот код в памятке, но я не имел успеха. Мне бы очень хотелось, если бы вы попытались сделать это. Еще раз спасибо. – user3210483

+1

@ user3210483: Использование 'deepcopy' не сделает ваш список неизменным. Во-первых, ваш список не меняется, поэтому зачем использовать его в качестве ключа для таблицы поиска? Единственное, что меняется, это 'n'. – Blender

+0

У меня есть идея, как попытаться использовать deepcopy, пожалуйста, посмотрите мое редактирование в первом сообщении. Благодарю. – user3210483