关于python的for嵌套循环
#约瑟夫环,在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-11 18:15 编辑
约瑟夫环问题的意思好像是报数为9的那个人,退出,紧接着从退出的这个人的下一个人重新开始从1报数,和上面过程类似,报数为9的人退出
把9删除了后,进入外层循环的第二次循环,内层又从1开始报数,报数到9,……
n表示当前报数的人的位置,j表示当前报数的人报的数
内层的j并不是从9的地方开始报的,而是从新开始从1开始报,直到下一个9 外层循环第二次进入的时候,内层还是从1开始的(for j in range(1,10))
就相当于第一个人退出之后,从下一个人开始重新从1开始报数,直到第二个报数为9的人退出,重复,一共重复29次,直到只剩下一个人 本帖最后由 jackz007 于 2022-8-11 19:00 编辑
嵌套循环一定是内层走一圈,外层走一步,等到外层也走完一圈的时候,整个嵌套循环就走到终点了。 jackz007 发表于 2022-8-11 18:59
嵌套循环一定是内层走一圈,外层走一步,等到外层也走完一圈的时候,整个嵌套循环就走到终点了。
还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始 本帖最后由 zzzyf 于 2022-8-11 22:53 编辑
violet777 发表于 2022-8-11 21:08
还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始
因为感觉不太好表达,所以用画板写了下 (字不太好,见谅)
因为删除操作的下标是由变量n控制的,所以: 本帖最后由 jackz007 于 2022-8-11 23:09 编辑
violet777 发表于 2022-8-11 21:08
还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始
他的这个嵌套循环,尤其是内层循环完全没有必要,反而把简单事情给复杂化了,看看我简化的代码
#约瑟夫环,在30个人当中,每次报数为9的那个人,退出,直到剩下最后一个人
i , d = 0 ,
for n in range(len(d) , 1 , -1):
i = (i + 8) % n
d . pop(i)
print(d) 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开始的。
这也是楼上说的“外层走一步,内层走一圈”{:10_333:}
抬头吧奔跑吧Q 发表于 2022-8-12 00:30
n = 0
for k in range(29):#需要删除的人的数量
for j in range(1, 10):
讲的很清楚,谢谢 jackz007 发表于 2022-8-11 22:58
他的这个嵌套循环,尤其是内层循环完全没有必要,反而把简单事情给复杂化了,看看我简化的代码
看你的代码,又陷入了新的迷惑,第4行不太懂
页:
[1]