我一直在研究https://runestone.academy/runestone/static/pythonds/index.html之外的算法和数据结构,并且深入探讨了动态编程和经典的最小硬币数目问题。给定一个总和,我们必须找出将各种面额的硬币转换成硬币所需的最小硬币数量。
本书提出的解决问题的代码中有2行即使我的生活依赖它也无法确定其角色。
代码在这里:
def recMC(coinValueList,change):
minCoins = change
if change in coinValueList:
return 1
else:
for i in [c for c in coinValueList if c <= change]:
numCoins = 1 + recMC(coinValueList,change-i)
if numCoins < minCoins:
minCoins = numCoins
return minCoins
print(recMC([1,5,10,25],63))
我不明白为什么我们需要这部分:
if numCoins < minCoins:
minCoins = numCoins
return minCoins
我尝试用一条语句替换所有3行
return numCoins
除了change == 0
之外,它似乎都可以正常工作。我认为他们在书中的书写方式并不是为了防止输入0,因为它可以更轻松地处理。
为什么他们会像以前那样写呢?
ps:如果重要的话,我正在python3.5上运行它...
欢呼
答案 0 :(得分:0)
如果金额不匹配,我们有几种选择。我们想要的是一个便士的最小值,再加上为原始金额找零所需的硬币数量减去一美分,或者一个镍币加上为原始金额找零所需的硬币数量减去五美分,或者一角钱加上零钱所需的硬币数量减十美分,依此类推。因此,可以根据以下公式计算更改原始数量所需的硬币数量:
numCoins=min(1+numCoins(originalamount−1),
1+numCoins(originalamount−5),
1+numCoins(originalamount−10),
1+numCoins(originalamount−25))
for循环中的以下行正在计算numCoins的每个选项。
for i in [c for c in coinValueList if c <= change]:
numCoins = 1 + recMC(coinValueList,change-i)
循环的后两行跟踪numCoins的最小值:
if numCoins < minCoins:
minCoins = numCoins
为了易于理解,您可以将函数重写为:
def recMC(coinValueList,change):
if change in coinValueList:
return 1
else:
return min([1 + recMC(coinValueList,change-c) for c in coinValueList if c < change])