鱼C论坛

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

[已解决]课后作业第016讲最后一题代码逻辑理解不了,求讲解

[复制链接]
发表于 2023-5-25 19:38:14 | 显示全部楼层 |阅读模式
5鱼币
代码如下
import random

counts = int(input("请输入抛硬币的次数:"))

# 利用 ignore 变量来判断是否打印每次的结果
if counts > 100:
    ignore = True
else:
    ignore = False

heads = 0 # 统计正面的次数
tails = 0 # 统计反面的次数

last = 0 # 记录上一次的状态,如果是正面设置为1, 反面则设置为2
c_heads = 0 # 统计连续正面的次数
c_tails = 0 # 统计连续反面的次数
max_heads = 0 # 统计连续正面的最多次数
max_tails = 0 # 统计连续反面的最多次数

i = 0
print("开始抛硬币实验……")
while i < counts:
    num = random.randint(1, 10)

    if num % 2:
        heads += 1
        c_heads += 1

        if not ignore:      
            print("正面", end=" ")

        # 如果上一次是反面:将连续正面的次数设置为1
        if last == 2:
            c_heads = 1

        # 判断连续正面的次数是否比max_heads大,如果是,取而代之
        if c_heads > max_heads:
            max_heads = c_heads

        # 将上一次的状态设置为正面
        last = 1
    else:
        tails += 1
        c_tails += 1
        
        if not ignore:
            print("反面", end=" ")

        # 如果上一次是正面:连续反面的次数设置为1
        if last == 1:
            c_tails = 1

        # 判断连续反面的次数是否比max_tails大,如果是,取而代之
        if c_tails > max_tails:
            max_tails = c_tails

        # 将上一次的状态设置为反面
        last = 2
        
    i += 1

print("")
print("一共模拟了", counts, "次抛硬币,结果如下:")
print("正面:", heads, "次", sep="")
print("反面:", tails, "次", sep="")
print("最多连续正面:", max_heads, "次", sep="")
print("最多连续反面:", max_tails, "次", sep="")


有大神能告诉我统计连续反面次数实现的逻辑是什么,我理解下来last 一直是为0
最佳答案
2023-5-25 19:38:15
这段代码是通过变量`last`来记录上一次抛硬币的结果是正面还是反面,然后根据这个结果来统计连续正面或反面的次数。

具体地说,如果这一次抛出的是正面,那么就将`last`设置为1(表示上一次是正面),并且将连续反面的次数`c_tails`重新设置为1(因为当前是正面,所以连续反面的次数要重新计数)。然后判断连续正面的次数是否比`max_heads`大,如果是,就将其赋值给`max_heads`;否则不做处理。最后将连续正面次数`c_heads`加1。

如果这一次抛出的是反面,那么就将`last`设置为2(表示上一次是反面),并且将连续正面的次数`c_heads`重新设置为1(因为当前是反面,所以连续正面的次数要重新计数)。然后判断连续反面的次数是否比`max_tails`大,如果是,就将其赋值给`max_tails`;否则不做处理。最后将连续反面次数`c_tails`加1。

在代码执行过程中,`last`的初值设为0是合理的,因为第一次抛硬币之前不存在上一次的结果,所以将`last`设为0是为了避免出现错误。

有用请设置最佳答案

最佳答案

查看完整内容

这段代码是通过变量`last`来记录上一次抛硬币的结果是正面还是反面,然后根据这个结果来统计连续正面或反面的次数。 具体地说,如果这一次抛出的是正面,那么就将`last`设置为1(表示上一次是正面),并且将连续反面的次数`c_tails`重新设置为1(因为当前是正面,所以连续反面的次数要重新计数)。然后判断连续正面的次数是否比`max_heads`大,如果是,就将其赋值给`max_heads`;否则不做处理。最后将连续正面次数`c_heads`加1 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-25 19:38:15 | 显示全部楼层    本楼为最佳答案   
这段代码是通过变量`last`来记录上一次抛硬币的结果是正面还是反面,然后根据这个结果来统计连续正面或反面的次数。

具体地说,如果这一次抛出的是正面,那么就将`last`设置为1(表示上一次是正面),并且将连续反面的次数`c_tails`重新设置为1(因为当前是正面,所以连续反面的次数要重新计数)。然后判断连续正面的次数是否比`max_heads`大,如果是,就将其赋值给`max_heads`;否则不做处理。最后将连续正面次数`c_heads`加1。

如果这一次抛出的是反面,那么就将`last`设置为2(表示上一次是反面),并且将连续正面的次数`c_heads`重新设置为1(因为当前是反面,所以连续正面的次数要重新计数)。然后判断连续反面的次数是否比`max_tails`大,如果是,就将其赋值给`max_tails`;否则不做处理。最后将连续反面次数`c_tails`加1。

在代码执行过程中,`last`的初值设为0是合理的,因为第一次抛硬币之前不存在上一次的结果,所以将`last`设为0是为了避免出现错误。

有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-25 19:42:54 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-5-25 19:43 编辑

这段代码实现了统计连续反面的逻辑。last变量在代码中的初始值为0,但是它随着抛硬币结果的改变而改变,记录上一次的状态。

具体来说,当抛的硬币出现正面时,将last设为1;当抛的硬币出现反面时,将last设置为2。在处理连续反面数时,使用if语句判断上一次的结果是否为正面(即last==1),如果是,则连续反面数c_tails赋为1,否则c_tails加1。同时,如果连续反面数c_tails大于最大连续反面数max_tails,则将max_tails替换为c_tails。在程序运行的过程中,last会不断被更新为当前抛硬币的结果。

因此,当进行连续反面统计时,代码是有效的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 13:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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