鱼C论坛

 找回密码
 立即注册
查看: 101|回复: 3

[已解决]新手求解,对于多层嵌套,while循环语句为什么只进行了一次内部循环?

[复制链接]
发表于 2024-4-13 19:00:54 | 显示全部楼层 |阅读模式

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

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

x
为了找出10以内的质数,我写了两段不同的循环嵌套,while语句为什么只进行了一次内部循环,只打印了2的结果,而第二段for循环的代码却是正常进入外部循环的呢?
第一段:
i = 2

while i < 10:
    j = 2
    while j < i:
        if i % j == 0:
            print(i,"=",j,"*",i//j,sep="")
            j += 1
            break
    else:
        print(i,"是质数",sep="")
    i += 1

第二段:
for i in range(2,10):
    for j in range(2,i):
        if i % j == 0:
            print(i,"=",j,"*",i//j,sep="")
            break
    else:
        print(i,"是质数",sep="")
第一段代码中将while j < i改为for j in range(2,i)则可实现第二段代码的效果,此情况令小弟十分费解,是否与迭代器相关?求各位大神指导。
最佳答案
2024-4-13 19:18:27
本帖最后由 jackz007 于 2024-4-13 19:22 编辑
  1. i = 2
  2. while i < 10:
  3.     j = 2
  4.     while j < i:
  5.         if i % j == 0:
  6.             print(i , "=" , j , "*" , i // j , sep = "")
  7.             j += 1                                         # 此句属于 if 语句块,意味着只能条件执行,如果在循环中 j 值不变,就会进入死循环
  8.             break
  9.     else:
  10.         print(i , "是质数" , sep = "")
  11.     i += 1
复制代码

应该改为:
  1. i = 2
  2. while i < 10:
  3.     j = 2
  4.     while j < i:
  5.         if i % j == 0:
  6.             print(i , "=" , j , "*" , i // j , sep = "")
  7.             break
  8.         j += 1                                            # 将此句从 if 语句块中移出,改为在内层循环中无条件执行
  9.     else:
  10.         print(i , "是质数" , sep = "")
  11.     i += 1
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2024-4-13 19:01:19 | 显示全部楼层
你好!让我们逐段分析一下你的代码。

第一段:
  1. i = 2
  2. while i < 10:
  3.     j = 2
  4.     while j < i:
  5.         if i % j == 0:
  6.             print(i,"=",j,"*",i//j,sep="")
  7.             j += 1
  8.             break
  9.     else:
  10.         print(i,"是质数",sep="")
  11.     i += 1
复制代码

这段代码中,最外层的while循环控制变量i在2到9之间循环。然后,在每次外部循环开始,将内部循环的控制变量j重新设置为2。接下来,内部的while循环控制变量j在2到i之间循环。

在内部循环中,你使用了一个条件判断,如果i能被j整除,就打印对应的结果并且跳出内部循环。否则,通过else语句块打印i是质数。然后,无论是否执行了break语句,都会执行i += 1来进行外部循环的迭代。

现在来看一下为什么只进行了一次内部循环:

当i等于2时,内部循环的控制变量j初始化为2,因为j不小于i,所以内部循环直接跳过。此时,外部循环打印出"2是质数"。然后,i递增到3。

当i等于3时,内部循环的控制变量j初始化为2,这一次j小于i,所以进入内部循环。由于3不能被2整除,所以没有执行break语句,而是通过else语句块打印"3是质数"。此时,i递增到4。

当i等于4时,内部循环的控制变量j初始化为2,这一次j小于i,所以进入内部循环。由于4能被2整除,所以执行了break语句来跳出内部循环。没有通过else语句块打印"4是质数"。此时,i递增到5。

以此类推,你会发现内部循环只进行了一次。这是因为当你进入内部循环后,只有在满足条件i能被j整除的情况下才会执行break语句,而不会递增j的值。因此,在下一次外部循环中,j仍然等于2,不满足条件j < i,所以内部循环直接跳过。

如果你想改变这个问题,你可以在if语句的前面添加j += 1,这样无论条件是否满足,j的值都会递增。或者,你可以使用for循环来替代内部的while循环,以便迭代j的值。

现在我们看一下第二段代码:
  1. for i in range(2,10):
  2.     for j in range(2,i):
  3.         if i % j == 0:
  4.             print(i,"=",j,"*",i//j,sep="")
  5.             break
  6.     else:
  7.         print(i,"是质数",sep="")
复制代码

这段代码与第一段代码的逻辑上是等价的,只不过使用了for循环代替了内部的while循环。这里的for循环会在每次迭代开始时,重新初始化控制变量j,并且在每次迭代结束时,通过自增操作来递增j的值。

因此,这段代码可以正常执行内部的循环,并且输出正确的结果。

希望以上解释能够帮助你理解。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2024-4-13 19:18:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-4-13 19:22 编辑
  1. i = 2
  2. while i < 10:
  3.     j = 2
  4.     while j < i:
  5.         if i % j == 0:
  6.             print(i , "=" , j , "*" , i // j , sep = "")
  7.             j += 1                                         # 此句属于 if 语句块,意味着只能条件执行,如果在循环中 j 值不变,就会进入死循环
  8.             break
  9.     else:
  10.         print(i , "是质数" , sep = "")
  11.     i += 1
复制代码

应该改为:
  1. i = 2
  2. while i < 10:
  3.     j = 2
  4.     while j < i:
  5.         if i % j == 0:
  6.             print(i , "=" , j , "*" , i // j , sep = "")
  7.             break
  8.         j += 1                                            # 将此句从 if 语句块中移出,改为在内层循环中无条件执行
  9.     else:
  10.         print(i , "是质数" , sep = "")
  11.     i += 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-4-13 19:25:58 | 显示全部楼层

感谢解惑,原来是我的条件位置放错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 08:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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