python找零钱的方法_python 递归 找零钱

首先回答你的问题

count = 1 + coins_changeREC(coin_values, change-value)#1.when reached here, one recursion link ends

if count < min_count:

min_count = count #2. update the minimum count of coins

每次走到注释1的地方的时候,对于一个coin_value开始的递归链已经结束并得到了总数。

这段代码意思是在对于每个面额硬币开始的递归过程中,不断维护min_count这个变量,使其为所有可能性组合中最小的硬币数目。但是如果一开始不给min_count赋值,那就需要在第一次有得到count值的时候,额外增加判断min_count是否有值的逻辑,如果有,和min_count比较,两者中较小值,如果无值,将count赋给min_count。而总额的数目比如20,比如50,肯定大于等于需要的硬币数,所以min_count值是个很好的初始值,只要无脑把count和min_count中较小值赋值给min_count就好了。

如果不给min_count初始值,则代码大致为:

def coins_changeREC(coin_values, change):

min_count = None

if change in coin_values:

return 1

for value in [i for i in coin_values if i <= change]:

count = 1 + coins_changeREC(coin_values, change-value)

if min_count is None:

min_count = count

else:

min_count = min(min_count,count)

return min_count

一点ps:

递归代码的思路比较反人类,想不清楚的时候可以画出递归的路径,也能帮你看出重复的递归路径,为日后进阶到动态规划打好基础。

这个代码在暴力递归解法中也是效率较低的,每次都要生产新的list,可以遍历原有的list,通过if筛选比change总数小的值的硬币就可以了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值