递归:用最少的硬币进行更改

时间:2016-10-17 14:21:28

标签: python algorithm recursion

我正在学习python中的数据结构和算法。这是递归的经典问题,涉及用最少的硬币进行更改。这是代码。 我不明白的是第2行。为什么我们需要minCoins = change?第8-9行是什么意思?任何人都可以解释一下吗?非常感谢你的帮助!

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))

1 个答案:

答案 0 :(得分:1)

minCoins = changeminCoins初始化为change,这是recMC可以返回的最大值,因为硬币的最小值为1,假定为整数硬币的价值。

if change in coinValueList: return 1:基本情况1 - 如果某个硬币的值为change,我们只需要抓住这1个硬币,然后返回1

for i in [c for c in coinValueList if c <= change]:: 然后该函数循环遍历1个单个硬币的所有可能值

numCoins = 1 + recMC(coinValueList,change-i):从i中扣除硬币值change,将1个硬币加到所需的硬币数量上,这是为剩余的更改(change-i)递归计算的。这可以从 2 基本情况

中归纳出来 此循环中的

if numCoins < minCoins: minCoins = numCoins有效地将最小数量的硬币分配给minCoins

如果change仍然具有minCoins的初始值(意味着c中没有值coinValueList满足c <= change),则表示硬币数量还需要change的值,即change 1单位硬币。这是基础案例2,它基于具有值1的硬币始终可用的前提条件。