鱼C论坛

 找回密码
 立即注册
查看: 1615|回复: 2

代码差别

[复制链接]
发表于 2023-10-8 14:23:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


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

    else:
        for each in [c for c in moneylist if c <= ownmoney]:

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


    return numbercoin


print(money(40,[1,5,10,25],[0]*63))


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

            min_coins = numbercoin
            if knownlist[min_coins] ==0:
                knownlist[ownmoney] = min_coins  # 将最小硬币数存储在knownlist中
    return min_coins


print(money(40, [1, 5, 10, 25], [0] * 61))

对于这两段代码,为什么只是多加了变量min_coins就,就会输出两个不同的结果,min_coins是干嘛用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-8 14:25:52 | 显示全部楼层
这两段代码的主要区别在于变量min_coins的使用。让我们逐步分析这两个代码段的执行过程。

第一个代码段:
1. 定义了一个函数money,接受三个参数ownmoney、moneylist和knownlist。
2. 首先判断ownmoney是否在moneylist中,如果是,则将knownlist中对应位置的值设为1,并返回1作为最小硬币数。
3. 如果ownmoney不在moneylist中,再判断knownlist中对应位置的值是否大于0,如果是,则返回knownlist中对应位置的值。
4. 如果knownlist中对应位置的值为0,进入for循环,遍历moneylist中小于等于ownmoney的元素。
5. 对于每个小于等于ownmoney的元素,递归调用money函数,传入ownmoney减去该元素的值作为新的ownmoney,继续寻找最小硬币数。
6. 将递归调用结果加1,得到当前ownmoney所需的硬币数。
7. 如果knownlist中对应位置的值为0,则将该值设为当前ownmoney所需的硬币数。
8. 返回当前ownmoney所需的硬币数。

第二个代码段:
1. 定义了一个函数money,接受三个参数ownmoney、moneylist和knownlist。
2. 首先判断ownmoney是否在moneylist中,如果是,则将knownlist中对应位置的值设为1,并返回1作为最小硬币数。
3. 如果ownmoney不在moneylist中,再判断knownlist中对应位置的值是否大于0,如果是,则返回knownlist中对应位置的值。
4. 如果knownlist中对应位置的值为0,进入for循环,遍历moneylist中小于等于ownmoney的元素。
5. 对于每个小于等于ownmoney的元素,递归调用money函数,传入ownmoney减去该元素的值作为新的ownmoney,继续寻找最小硬币数。
6. 将递归调用结果加1,得到当前ownmoney所需的硬币数。
7. 将当前ownmoney所需的硬币数与min_coins比较,如果小于min_coins,则更新min_coins的值。
8. 如果knownlist中对应位置的值为0,则将该值设为当前ownmoney所需的硬币数。
9. 返回min_coins作为最小硬币数。

变量min_coins的作用是用来记录当前ownmoney所需的最小硬币数。在第一个代码段中,没有使用min_coins,而是直接使用numbercoin来记录最小硬币数。而在第二个代码段中,使用min_coins来记录最小硬币数,并在每次递归调用时更新min_coins的值。这样可以确保最终返回的是整个递归过程中的最小硬币数。

因此,这两段代码的不同之处在于最小硬币数的记录方式,导致最终输出的结果不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-8 18:07:28 | 显示全部楼层
首先,让我们分析一下你提供的两段代码。这两段代码都是用于计算找零的最小硬币数量的递归函数。`ownmoney` 是需要找零的金额,`moneylist` 是硬币面额的列表,`knownlist` 是一个列表,用于存储已知的找零金额的最小硬币数量。

在第一段代码中,你没有使用 `min_coins` 变量。在 `else` 语句中,你遍历了所有小于等于 `ownmoney` 的硬币面额,然后递归地调用 `money` 函数。但是,你没有比较不同硬币组合的最小硬币数量,而是直接将 `numbercoin` 的值存储在 `knownlist` 中。这可能会导致在某些情况下得到错误的结果。

在第二段代码中,你使用了 `min_coins` 变量来存储当前找到的最小硬币数量。然而,你在遍历过程中并没有正确地更新 `min_coins`。你应该在找到更小的硬币数量时更新 `min_coins`。以下是修改后的代码:

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

            if numbercoin < min_coins:
                min_coins = numbercoin  # 更新最小硬币数量

        knownlist[ownmoney] = min_coins  # 将最小硬币数存储在knownlist中
    return min_coins

print(money(40, [1, 5, 10, 25], [0] * 61))

现在,代码将正确地比较不同硬币组合的最小硬币数量,并将其存储在 `knownlist` 中。这样,你就可以得到正确的结果。

总之,`min_coins` 变量的作用是在遍历过程中存储当前找到的最小硬币数量。在第一段代码中,由于没有使用 `min_coins` 变量,你没有正确地比较不同硬币组合的最小硬币数量,这可能导致错误的结果。在第二段代码中,使用 `min_coins` 变量可以确保你找到最小的硬币数量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表