鱼C论坛

 找回密码
 立即注册
查看: 3419|回复: 10

[已解决]关于python的for嵌套循环

[复制链接]
发表于 2022-8-11 17:49:18 | 显示全部楼层 |阅读模式

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

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

x
#约瑟夫环,在30个人当中,每次报数为9的那个人,退出,直到剩下最后一个人

L = []
for i in range(1, 31):
    L.append(i)

n = 0
for k in range(29):  #需要删除的人的数量
    for j in range(1, 10):
        if n >= len(L):
            n = 0

        if j == 9:
            L.pop(n)
            #print(L)
        else:
            n += 1
print(L)

#我的问题是,比如执行了第一次,把9删除了后,进入外层循环的第二次循环,内层是从下标为9的地方开始第二次报数的,为啥是j可以下标为9的地方,后者第三次循环会自己定位到删除的数字的下一位数字,而不是,每次进入内循环后,都是从下标为0的地方开始报数。就是这个双重循环我不是很懂,是什么个运行原理。
最佳答案
2022-8-12 00:30:04
n = 0
for k in range(29):  #需要删除的人的数量
    for j in range(1, 10):
外循环开始走第一步,k = 0时:内循环就需要把循环体内的代码走完(因为一直满足外循环k=1的条件,所以内层循环会执行完循环内所有的代码,也就是内层走一圈,),for j in range(1, 10)遍历结束,此时n= 8, j = 9;
然后外循环走第二步,k = 1,内循环 因为又是从循环体内从头开始执行for j in range(1, 10),这里就是把j=1重新开始遍历,n没有任何处理,所以此时还是n=8,也就是内循环第二次开始时,是带着n=8,j=1开始的。
这也是楼上说的“外层走一步,内层走一圈”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-11 18:01:18 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 一点点儿 于 2022-8-11 18:15 编辑

约瑟夫环问题的意思好像是  报数为9的那个人,退出,紧接着从退出的这个人的下一个人重新开始从1报数,和上面过程类似,报数为9的人退出
把9删除了后,进入外层循环的第二次循环,内层又从1开始报数,报数到9,……
n表示当前报数的人的位置,j表示当前报数的人报的数

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

使用道具 举报

发表于 2022-8-11 18:09:17 | 显示全部楼层
内层的j并不是从9的地方开始报的,而是从新开始从1开始报,直到下一个9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-11 18:31:46 | 显示全部楼层
外层循环第二次进入的时候,内层还是从1开始的(for j in range(1,10))
就相当于第一个人退出之后,从下一个人开始重新从1开始报数,直到第二个报数为9的人退出,重复,一共重复29次,直到只剩下一个人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-11 18:59:38 | 显示全部楼层
本帖最后由 jackz007 于 2022-8-11 19:00 编辑

         嵌套循环一定是内层走一圈,外层走一步,等到外层也走完一圈的时候,整个嵌套循环就走到终点了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-11 21:08:00 | 显示全部楼层
jackz007 发表于 2022-8-11 18:59
嵌套循环一定是内层走一圈,外层走一步,等到外层也走完一圈的时候,整个嵌套循环就走到终点了。

还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-11 22:46:22 | 显示全部楼层
本帖最后由 zzzyf 于 2022-8-11 22:53 编辑
violet777 发表于 2022-8-11 21:08
还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始


因为感觉不太好表达,所以用画板写了下 (字不太好,见谅)

因为删除操作的下标是由变量n控制的,所以:

如图

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

使用道具 举报

发表于 2022-8-11 22:58:23 | 显示全部楼层
本帖最后由 jackz007 于 2022-8-11 23:09 编辑
violet777 发表于 2022-8-11 21:08
还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始


      他的这个嵌套循环,尤其是内层循环完全没有必要,反而把简单事情给复杂化了,看看我简化的代码
#约瑟夫环,在30个人当中,每次报数为9的那个人,退出,直到剩下最后一个人

i , d = 0 , [i for i in range(1 , 31)]
for n in range(len(d) , 1 , -1):
    i = (i + 8) % n
    d . pop(i)
print(d)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-12 00:30:04 | 显示全部楼层    本楼为最佳答案   
n = 0
for k in range(29):  #需要删除的人的数量
    for j in range(1, 10):
外循环开始走第一步,k = 0时:内循环就需要把循环体内的代码走完(因为一直满足外循环k=1的条件,所以内层循环会执行完循环内所有的代码,也就是内层走一圈,),for j in range(1, 10)遍历结束,此时n= 8, j = 9;
然后外循环走第二步,k = 1,内循环 因为又是从循环体内从头开始执行for j in range(1, 10),这里就是把j=1重新开始遍历,n没有任何处理,所以此时还是n=8,也就是内循环第二次开始时,是带着n=8,j=1开始的。
这也是楼上说的“外层走一步,内层走一圈”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-12 14:19:44 | 显示全部楼层
抬头吧奔跑吧Q 发表于 2022-8-12 00:30
n = 0
for k in range(29):  #需要删除的人的数量
    for j in range(1, 10):

讲的很清楚,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-12 14:20:27 | 显示全部楼层
jackz007 发表于 2022-8-11 22:58
他的这个嵌套循环,尤其是内层循环完全没有必要,反而把简单事情给复杂化了,看看我简化的代码

看你的代码,又陷入了新的迷惑,第4行不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 08:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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