零基础入门学习Python P17 最新版 了不起的分支和循环(III) 抛硬币课后作业 最后...
问题是小甲鱼《零基础入门学习Python》最新版 P17 了不起的分支和循环(III) 最后一题 抛硬币问题 求连续向上或者向下的次数。题目地址: https://fishc.com.cn/thread-159296-1-1.html
本人小白,有些数学知识,但编程完全0基础,之前的作业感觉还可以,基本都能自己写出来,个别看下答案也就理解了。
但感觉最后一题的最后一问 抛硬币问题 求连续向上或者向下的次数,个人感觉真的难。自己看答案,思考半天了,还是想不通。真是难受啊!跪求大神们指点迷津。我把我的问题详细叙述如下。当然也不是全部不懂。
主要是这一段:中间的那个取而代之能理解。上下的两句不理解。上面一句,意思上能理解,“如果上一次是反面:将连续正面的次数设置为1”,(就是说,上一次是反面的话,如果这次是正面,那么连续正面次数就是1,所以设置为1。这样理解应
该对吧?)但是这个last为何能变化,我却十分不理解。前面先开始是让last=0了不是?这块用==判断last是否为2,last怎么可能为2呢?程序里面也没有用“=”去给last赋值,怎么这块儿last就有可能是2呢?
总而言之 一句话,last是怎么赋值 1或者2的。我最后写了一个print(last),试了好几次,last应该表示倒数第二个值吧?但倒数第二个值是反面,print(last)却显示1,请看图。。。。。
总之,一句话,last是怎么赋值1或者2的,last=1如何代表正面,last=2如何代表反面。这个逻辑我真的很糊涂。#后面的语句是有说,但这个自然不是讲给python听得吧。谢谢大家啦!!!!! 感觉last 的取值你可以自定义,设置1 2 没有什么特别的意思,就只是表示上次的结果而已,last赋值出现在if语句和else语句的最后一段 先去求余数
如果余数为1,那么我们认定为他是正面,将last设置为1
如果余数为2,那么我们认定为他是反面,将last设置为2 确实 这道题我也不是很理解 先赋值变量last=0
可以把1/2理解为正面和反面,
当抛出结果为正面的时候last=正面,
记录正面次数一次
因为变量的初始值不是正面,所以第二个条件分支,正面最大次数是1次
然后重新循环,第二次结果是反面的话,判断上次记录的结果是正面,直接给反面结果直接计为1次
然后重新循环,第三次结果是反面的话,判断上次记录的结果是反面,直接给反面连续次数加1次
这样能不能理解
请问这个明白了吗,我在这也卡住了
修改了一下,看是否便于理解。
将记录上次状态变量弃用,硬币换面时可以用清0方法更简洁;同面连续计数打印出来更直观:
#coding=gbk
import random
counts = int(input("请输入一个正整数:"))
#利用ignore判断是否打印
if counts > 100:
ignore = True
else:
ignore = False
heads = 0#正面计数
tails = 0#反面计数
#last = 0#记录上次状态,硬币换面时可以用清0方法更简洁
c_heads = 0#连续正面次数
max_heads= 0#正面最大值
c_tails = 0#连续反面次数
max_tails = 0#反面最大值
i = 0#用于while函数计数器
print("开始抛硬币实验...")
while i < counts:
num = int(random.randint(1,2)) #1正面,2反面
if num == 1:#等价于num % 2
heads += 1#正面计数
c_heads += 1#正面连续次数
if not ignore:
print("正面",end = "-")
print(c_heads,end = " | ")#连续计数值,省得去数了
c_tails = 0#反面连续次数清零
else:
tails += 1#反面计数
c_tails += 1#反面连续次数
if not ignore:
print("反面",end = "-")
print(c_tails,end = " | ")#连续计数值,省得去数了
c_heads =0 #正面连续次数清零
if c_heads != 0:#连续正面取最大值
if c_heads >= max_heads :
max_heads = c_heads
if c_tails != 0:#连续反面取最大值
if c_tails >= max_tails:
max_tails = c_tails
i += 1#用于while函数计数器
print()#增加一个换行
print("正面的个数:",heads)
print("反面的个数:",tails)
print("正面最多次数:",max_heads )
print("反面最多次数:",max_tails)
运行结果:
请输入一个正整数:30
开始抛硬币实验...
反面-1 | 正面-1 | 正面-2 | 正面-3 | 正面-4 | 反面-1 | 正面-1 | 反面-1 | 正面-1 | 反面-1 | 反 面-2 | 反面-3 | 反面-4 | 正面-1 | 反面-1 | 正面-1 | 正面-2 | 反面-1 | 反面-2 | 反面-3 | 反面-4 | 正面-1 | 反面-1 | 反面-2 | 正面-1 | 反面-1 | 反面-2 | 反面-3 | 反面-4 | 反面-5 |
正面的个数: 11
反面的个数: 19
正面最多次数: 4
反面最多次数: 5 在程序后面
#将上一次状态设置为反面
那条注释下面不是把last赋值成2了吗?
其实1,2代表啥完全由你决定,用啥去代表也是你的自由,只要自己看的懂,程序不会出错就行了 这题对于零基础的伙伴们确实有些难!深有体会 !可以一步步拆解,把每个if循环嵌套里面print出连续次数值,连续最大次数值,一步步去看怎么循环和取值,就不难发现,last的取值主要目的是为了实现硬币投掷过程中正反面的交替,再通过判定后的c_heads或者c_tails赋值计算后续每一个循环的连续取值(如果不交替),是否赋值给前次循环中的max_heads或者max_tails(条件已经著名要大于),至于last取值可以任意,也就是可以正面自定义一个值,反面自定义一个值,初始值自定义一个值!
页:
[1]