weijia910512 发表于 2022-12-11 23:42:15

第16讲课后作业最后一题无法理解

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,前面声明了last是=数字0的,(虽然前面一开始声明last=0的时候井号后面的中文告诉我正面是1反面是2,但这是解释给我们看的,python并不读懂这句话啊,代码此时肯定认为last是0啊)
可后面突然无中生有就来一句if last == 2:我不明白为啥last会等于2,他为何不能是3或者4或者其他数字。
因为在last==2前面的代码中并没有出现last的计算。我认为他目前还是=0的。像其他的变量比如heads和c_heads,他们一开始声明=0,但是当num%2==0也就是偶数的时候,
heads和c_heads就会各加上1,这个很好理解,他们因为被声明+1了,此时他们就是1,这没啥好说的,但是last这个值又没有声明是怎么计算出来的。就突然来一句如果last == 2
实在是无法理解,不知道我的疑惑表达大伙能感同身受不,我怕我叙述了你们还听不懂....

香蕉那个不拿拿 发表于 2022-12-12 06:57:40

多多少少新鱼油都有这种疑惑,先自己通读代码,尤其是IF ELSE那一部分,看看自己能理解吗,等一会我在把代码做一个详解

香蕉那个不拿拿 发表于 2022-12-12 07:11:51

统计正反面次数不难理解
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:#num%2表示的是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="")

这个程序要理解他是怎么去统计连续次数的
就是用记录上一次的面,来和现在的面所对比,相等则不作改动(—因为连续的一直在记录)
                                                                   不等则把当前面数设为一(不然连续次数就会一直累加)

香蕉那个不拿拿 发表于 2022-12-12 07:13:12

重要的是代码41和58行

香蕉那个不拿拿 发表于 2022-12-12 07:14:10

就是来记录上一次以供以这一次对比的

香蕉那个不拿拿 发表于 2022-12-12 07:15:38

你可以通过举例来理解,假设情况为什么什么
再把情况带入到代码

香蕉那个不拿拿 发表于 2022-12-12 07:18:01

再一个,这是一个循环,整体着看看,想想last=1(上一次是正)
                                                             last=2(上一次是反)
是从哪里来,怎么设的

weijia910512 发表于 2022-12-12 17:03:07

香蕉那个不拿拿 发表于 2022-12-12 07:11
统计正反面次数不难理解

这个程序要理解他是怎么去统计连续次数的


香蕉哥,非常谢谢你百忙之中抽空帮我理清了思路,我就是死脑筋,当我把代码从上到下依次自己在心里模拟程序自己跑几次数字过后,我就整明白了,确实代码41和58是关键,他记录了当下这把的正反面,惊叹于逻辑思维得多缜密才能解出这道题。这道题的前置那道我想了个把小时才答出来,最后这道确实昨晚想了一整晚没想出来。谢谢香蕉哥,谢谢!
页: [1]
查看完整版本: 第16讲课后作业最后一题无法理解