Я работаю над алгоритмом для подсчета количества способов построить 100 центов, используя бесконечное количество пенни, десятицентовика, пятицентовика и четвертака.
В итоге я пришел к вышеизложенному (который работает AFAIK):
def count_ways(amount)
num_ways(amount, 0)
end
def num_ways(amount, index)
return 1 if amount == 0
return 0 if index >= COINS.length || amount < 0
num_ways(amount - COINS[index], index) +
num_ways(amount, index + 1)
end
Теперь я хотел бы запомнить этот алгоритм. Эффективный способ, который я нашел для размышления о запоминании, состоит в том, чтобы рассмотреть, какие входные данные мы многократно передаем в эту функцию. В этом случае я хотел бы запомнить комбинацию параметров суммы и индекса.
Обычно, когда у меня есть два параметра, я создаю массив из двух D для запоминания, но здесь это имеет гораздо меньше смысла. Следовательно, как вы можете запомнить эти два параметра? Есть ли смысл делать что-то подобное?
def count_ways(amount)
memo = Hash.new { |h, k| h[k] = [] }
num_ways(amount, 0, memo)
end
def num_ways(amount, index, memo)
return 1 if amount == 0
return 0 if index >= COINS.length || amount < 0
memo[amount - COINS[index], index] ||= num_ways(amount - COINS[index], index)
memo[amount, index + 1] ||= num_ways(amount, index + 1)
memo[amount - COINS[index], index] +
memo[amount, index + 1]
end