davidmou 发表于 2023-10-8 09:35:21

代码差别


【求助帖】请及时确认最佳答案,下次提问时可以得到更多关注,问题可以更快解决


def money(ownmoney, moneylist,knownlist):
    if ownmoney in moneylist:
      knownlist = 1
      return 1
    #如果ownmoney 已经在列表中存在其最小硬币数,如3,我就不用再递归啦,直接调用器最小硬币数,也是结束递归的条件
    elif knownlist >0:
      return knownlist

    else:
      for each in :

            numbercoin = 1 + money(ownmoney - each, moneylist,knownlist)
            if knownlist == 0:
                knownlist = numbercoin


    return numbercoin


print(money(40,,*63))




def money(ownmoney, moneylist, knownlist):
    if ownmoney in moneylist:
      knownlist = 1
      return 1
    elif knownlist > 0:
      return knownlist
    else:
      min_coins = float('inf')# 初始化最小硬币数为正无穷
      for each in :
            numbercoin = 1 + money(ownmoney - each, moneylist, knownlist)
            if numbercoin < min_coins:
                min_coins = numbercoin
      knownlist = min_coins# 将最小硬币数存储在knownlist中
      return min_coins


print(money(40, , * 41))

上面两段代码有什么区别,为什么要用min_coins 保存numbercoins变量,print的输出结果也不同

isdkz 发表于 2023-10-8 09:36:28

这两段代码是求解给定金额的最小硬币数的递归函数。它们之间的区别在于第二段代码使用了一个变量 min_coins 来保存最小硬币数,而第一段代码没有。

在第一段代码中,当找到 ownmoney 在硬币列表 moneylist 中时,将其对应的 knownlist 值设为1,并返回1。如果 ownmoney 已经在 knownlist 中存在一个大于0的值,即已经计算过最小硬币数,直接返回该值。否则,遍历 moneylist 中小于等于 ownmoney 的硬币值,递归调用 money 函数,并加上1,得到 numbercoin 。如果 knownlist 为0,将其设为 numbercoin 。最后返回 numbercoin 。

而在第二段代码中,除了上述逻辑外,还引入了 min_coins 变量,用于保存当前的最小硬币数。在遍历 moneylist 中小于等于 ownmoney 的硬币值时,如果得到的 numbercoin 小于 min_coins ,则将 min_coins 更新为 numbercoin 。最后将 min_coins 存储在 knownlist 中,并返回 min_coins 。

由于第二段代码使用了 min_coins 来保存最小硬币数,可以保证在遍历完所有硬币值后, min_coins 保存的是最小的硬币数。而第一段代码没有使用 min_coins ,只是直接返回 numbercoin ,因此无法保证返回的是最小硬币数。

因此,第二段代码更加准确地计算了给定金额的最小硬币数,并且输出结果也会更准确。
页: [1]
查看完整版本: 代码差别