关于0基础入门学python的第九讲 第三道作业的问题
有红、黄、蓝三种颜色的求,其中红球 3 个,黄球 3 个,绿球 6 个。先将这 12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种颜色搭配。print('red\tyellow\tgreen')
for red in range(0, 4):
for yellow in range(0, 4):
for green in range(2, 7):
if red + yellow + green == 8:
# 注意,下边不是字符串拼接,因此不用“+”哦~
print(red, '\t', yellow, '\t', green)
复制代码
这是题目和答案
我不太懂为什么 for red in range(0, 4) 第一次将0的值赋给red之后,第二次循环时,还是会把0再次赋给red。不是把range()列表中的值赋给左边的变量后,下次循环就会赋予下一个值给左边变量吗(即赋予1给red)? 因为red是最外层的循环,所以得先把内部的两层循环 循环完了,再重新循环一次。 本帖最后由 liuzhengyuan 于 2020-7-12 12:29 编辑
外部循环执行 1 次,内部循环就执行 n 次
这是一层一层嵌套枚举的
这位大佬有详细解释:
【Pyhon 009讲心得体会】【摸球和水仙花数 】
https://fishc.com.cn/thread-126088-1-1.html
(出处: 鱼C论坛)
4、摸球的问题:
卧槽,看着好复杂有木有?一点也不明白有木有?谁第一眼看着这种for循环套for循环的语句都懵逼。
其实按照正常人思维推导一下,感觉似乎没有想象的那么难。
只是简单的嵌套三层的for循环,一起分析一下:
首先是red的for循环:
红球数量是0的时候,有几种组合呢?
红球*0 + 黄球*2 + 绿球*6
红球*0 + 黄球*3 + 绿球*5
红球为零的情况下,为了达到摸出的球有8只,只有这两种组合。
红球数量为1的时候呢?
红球*1 + 黄球*1 + 绿球*6
红球*1 + 黄球*2 + 绿球*5
红球*1 + 黄球*3 + 绿球*4
可以从上面看出来,在红球是1的时候,黄球就已经几乎循环了一个遍了,继续:
红球*2 +黄球*0 + 绿球*6
红球*2 + 黄球*1 + 绿球*5
红球*2 + 黄球*2 + 绿球*4
红球*2 + 黄球*3 + 绿球*3
可以看出,红球是2的时候,为了达到8个球的总数,黄球已经可以为零了,话说就是摸出两个红球的时候,黄球就已经从0到3遍历了一遍了。继续:
红球*3 + 黄球*0 + 绿球*5
红球*3 + 黄球*1 + 绿球*4
红球*3 + 黄球*2 + 绿球*3
红球*3 + 黄球*3 +绿球*2
至此,红球和黄球都完成了自身的遍历。红球和黄球的方式推完了,下面我们算绿球的:
绿球为零的时候,红球和黄球都算上(红球、黄球都各只有三个),为了摸出8个球,不够,差俩。
绿球为一的时候,红球和黄球都算上,不够,差一个。
绿球为二的时候呢?,好熟悉,不就是推导黄球遍历的时候 红球*3 + 黄球*3 + 绿球*2 的时候嘛!
绿球为三呢?也找到了,绿球一直到为六(只有六个),也都在上面找到了。
所以,算一算方法,一共是13种,是不是跟答案一样呢?
实际上我不推荐这种笨方法,但是这种笨方法对理解此题有效果。
可以从推算中看出,实际上我们先遍历了红球的从零到3的变化,也就是for i in range(0,4)
其次,红球遍历完了,我们遍历的是黄球(0,4),然后是绿球(2,7)。
所以大循环上,先套上red,red循环0的时候,下面yellow循环2,再下面绿的循环6.
后套上yellow,再套上green.(I don't have any green...)
就把这个题理解了。 qiuyouzhi 发表于 2020-7-12 12:24
因为red是最外层的循环,所以得先把内部的两层循环 循环完了,再重新循环一次。
感谢了~
liuzhengyuan 发表于 2020-7-12 12:25
外部循环执行 1 次,内部循环就执行 n 次
这是一层一层嵌套枚举的
感谢了~
页:
[1]