Python 使用备忘录调试更改查找

Python 使用备忘录调试更改查找,python,recursion,dynamic-programming,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]

从最近几个小时开始,我一直在尝试调试这段代码

问题:给定一组硬币: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, {})
def更改记录备忘(更改列表、金额、备忘):
如果变更清单中的金额:
备注[金额]=(1[金额])
返回1,[金额]
如果备忘录中的金额:
退货通知单[金额]
迷你,值,迷你币=无,[],无
兑换硬币清单:
如果金额-硬币>0:
计数,子值=更改记录备忘(更改列表,金额硬币,备忘)
如果mini为None:
mini=计数
值=子值
硬币
如果计数<最小值:
mini=计数
值=子值
硬币
附加值(最小硬币)
备注[金额]=(最小值+1,值)
返回mini+1,值
def main():
打印更改记录备忘录([1,5,10,21,25],52,{})
该代码似乎在大多数情况下运行良好,但在52、63等情况下失败。它输出正确数量的硬币,但硬币清单包含额外的硬币


这里有一个Python提琴:

有一个更可读、更简短的示例。使用stack变量(递归函数的参数)

导入系统 @functools.lru_cache() def更改记录备忘录(更改列表、金额、计数): 如果金额=0: 返回计数 如果len(change_list)==0或amount<0:返回sys.maxsize 如果金额-变更清单[-1]>=0: return min(更改记录备忘(更改列表,金额-更改列表[-1],计数+1),更改记录备忘(更改列表[-1],金额,计数)) 其他: 返回更改记录备忘(更改列表[:-1],金额,计数) 打印(更改记录备忘录(1,5,10,21,25,215,0))
您正在修改备忘条目。我只是赋值并从中读取,我没有修改它,除了我所在的基本情况。
值。追加(min_coin)
-想想什么是
值以及它来自何处。(有些可能会有帮助。)@user2357112观察得不错,伙计。@user2357112:我只是想把头发拔出来!!我所需要做的就是:values=sub_values[:],一切都按预期进行!!!有趣的是,我知道python通过引用引用对象,但仍然犯了这个错误!!
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))