鱼C论坛

 找回密码
 立即注册
查看: 1397|回复: 4

[已解决]关于0基础入门学python的第九讲 第三道作业的问题

[复制链接]
发表于 2020-7-12 12:21:56 | 显示全部楼层 |阅读模式

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

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

x
有红、黄、蓝三种颜色的求,其中红球 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)?
最佳答案
2020-7-12 12:25:53
本帖最后由 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...)

就把这个题理解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-12 12:24:10 | 显示全部楼层
因为red是最外层的循环,所以得先把内部的两层循环 循环完了,再重新循环一次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 12:25:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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...)

就把这个题理解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 12:32:41 | 显示全部楼层
qiuyouzhi 发表于 2020-7-12 12:24
因为red是最外层的循环,所以得先把内部的两层循环 循环完了,再重新循环一次。

感谢了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 12:33:12 | 显示全部楼层
liuzhengyuan 发表于 2020-7-12 12:25
外部循环执行 1 次,内部循环就执行 n 次
这是一层一层嵌套枚举的

感谢了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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