使用Memoization调试更改查找

时间:2017-08-14 05:13:19

标签: python recursion dynamic-programming

从过去几个小时开始,我一直在尝试调试此代码。

问题:给定一组硬币:1,5,10,21和25写一个算法,使用尽可能少的硬币找到给定金额的变化。

例如:如果金额为63,则应返回3 [21,21,21]

我的代码:

def change_rec_memo(change_list, amount, memo):
    if amount in change_list:
        memo[amount] = (1, [amount])
        return 1, [amount]
    if amount in memo:
        return memo[amount]
    mini, values, min_coin = None, [], None
    for coin in change_list:
        if amount - coin > 0:
            count, sub_values = change_rec_memo(change_list, amount-coin, memo)
            if mini is None:
                mini = count
                values = sub_values
                min_coin = coin
            if count < mini:
                mini = count
                values = sub_values
                min_coin = coin
    values.append(min_coin)
    memo[amount] = (mini+1, values)
    return mini+1, values


def main():
    print change_rec_memo([1, 5, 10, 21, 25], 52, {})

对于大多数情况,代码似乎工作正常,但对于像52,63这样的情况则失败。它输出正确数量的硬币,但coin_listing包含额外的硬币。

这是一个Python小提琴:https://pyfiddle.io/fiddle/08b3da45-0c0d-464a-b025-00d215bc4634/?i=true

1 个答案:

答案 0 :(得分:0)

还有一个更可读和更简短的例子。并使用堆栈变量(递归函数的参数)

import sys
@functools.lru_cache()
def change_rec_memo(change_list, amount, count):
    if amount == 0:
        return count
    if len(change_list) == 0 or amount < 0:return sys.maxsize
    if amount - change_list[-1] >= 0:
        return min(change_rec_memo(change_list,amount - change_list[-1], count +1),change_rec_memo(change_list[:-1], amount, count))
    else:
        return change_rec_memo(change_list[:-1], amount, count)
print(change_rec_memo((1, 5, 10, 21, 25), 215,0))