violet777 发表于 2022-8-11 17:49:18

关于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:01:18

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

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

临时号 发表于 2022-8-11 18:09:17

内层的j并不是从9的地方开始报的,而是从新开始从1开始报,直到下一个9

西桥桥桥 发表于 2022-8-11 18:31:46

外层循环第二次进入的时候,内层还是从1开始的(for j in range(1,10))
就相当于第一个人退出之后,从下一个人开始重新从1开始报数,直到第二个报数为9的人退出,重复,一共重复29次,直到只剩下一个人

jackz007 发表于 2022-8-11 18:59:38

本帖最后由 jackz007 于 2022-8-11 19:00 编辑

         嵌套循环一定是内层走一圈,外层走一步,等到外层也走完一圈的时候,整个嵌套循环就走到终点了。

violet777 发表于 2022-8-11 21:08:00

jackz007 发表于 2022-8-11 18:59
嵌套循环一定是内层走一圈,外层走一步,等到外层也走完一圈的时候,整个嵌套循环就走到终点了。

还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始

zzzyf 发表于 2022-8-11 22:46:22

本帖最后由 zzzyf 于 2022-8-11 22:53 编辑

violet777 发表于 2022-8-11 21:08
还是不太懂,为啥第二次内层循环的时候是接着第一次删除的下一个来循环,而不是从列表的第一个开始

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

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

jackz007 发表于 2022-8-11 22:58:23

本帖最后由 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)

抬头吧奔跑吧Q 发表于 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开始的。
这也是楼上说的“外层走一步,内层走一圈”{:10_333:}

violet777 发表于 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):


讲的很清楚,谢谢

violet777 发表于 2022-8-12 14:20:27

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

看你的代码,又陷入了新的迷惑,第4行不太懂
页: [1]
查看完整版本: 关于python的for嵌套循环