【问题标题】:Nested While loop not working as expected嵌套的 While 循环未按预期工作
【发布时间】:2020-11-05 16:33:05
【问题描述】:

我对 Python 很陌生。我刚刚了解了 for 和 while 循环。有一个练习让我们打印列表中的所有素数。我做了以下

my = [4,5,7,16,17,35,20,37]

for i in my:
    j = 2
    while j < i:
        if i % j == 0:
            break
        j = j + 1
    else:
        print(i)

这很有效,但是由于我只是在学习,出于好奇,我尝试替代地实现结果

我没有在if 条件中过滤和禁止数字为非素数,而是尝试做相反的事情,即在if 条件中将数字评估为素数,并使用 else 打印非出现或素数

my = [4,5,7,16,17,35,20,37]

for i in my:
    j = 2
    while j < i:
        if i % j != 0:
            print(i)
        j = j + 1
    else:
        print("Prime No not found")

这个代码的问题 it ,只要 j 的第一个实例满足 if 条件,它就会打印 (i)。 在 if 语句中,理想情况下,我希望它首先完成 j 的 while 循环,并且仅当 j 的所有实例都满足 (i % j is != 0) 时才打印 (i)

以我目前的知识,我无法修复它。有人可以纠正我的代码吗?

PS:我不想要一个完全不同或高级的答案,只需要我自己的改变,这样我就可以在我的初学者水平上理解。

简而言之,我基本上是在尝试使用 if 条件来存储素数,else 用于非素数,这与我的第一个工作代码相反

【问题讨论】:

  • 我认为打印前缩进有错误
  • 修复代码与您给出的第一个代码示例有何不同?我可以想出一个使用 all 和生成器表达式的版本,但任何更简单的东西都将与您开始的地方基本相同。
  • @Blckknght 我基本上想使用 if 条件来存储素数和非素数,这与我的第一个代码不同。我认为这是可能的
  • 不,这是不可能的。如果存在 any 除数,则您的数不是素数(因此您可以停止检查其余数)。只有当你检查了它们全部(或一个子集,有更聪明的算法测试更少)时,你才能知道一个值是素数。
  • @Blckknght 感谢您的确认,如果您可以将其写为答案。我将标记为已接受

标签: python python-3.x list for-loop while-loop


【解决方案1】:

观察我在代码中实现的cmets:

my = [4,5,7,16,17,35,20,37]

for i in my:
    j = 2
    while j < i:
        if i % j == 0: # As long as there's a single division that results in 0 remainder, the number is not prime
            break
        j = j + 1
    else:
        print(i)

由于您在下面的while 循环中没有break 语句,因此将始终启动else 语句。这就是 while else 声明的全部意义所在。所以你需要在某处添加break

my = [4,5,7,16,17,35,20,37]

for i in my:
    j = 2
    while j < i:
        if i % j != 0: # If a number is prime, all the cases will result in non-zero remainder, so many numbers will be print out
            print(i)
        j = j + 1
    else:
        print("Prime No not found")

【讨论】:

  • 感谢您的回答,但第二个代码的输出与我最初的输出相同
  • @Sachin 是的,我指出了错误,但没有更改。
  • 糟糕,我也编辑了有问题的,缩进可能在粘贴过程中有点混乱
【解决方案2】:
my = [4,5,7,16,17,35,20,37]

for i in my:
    j = 2
    while j < i:
        if i % j != 0:
          print(i)
        break # you need to put the break out of if statement,so it will go to the next number to test, Hope this help
    else:
        print("Prime No not found")

【讨论】:

  • 感谢您的回答,尽管出于某种原因它也会打印 35
  • 此代码打印所有非偶数。内部循环只运行一次迭代,因此您只需使用j=2 进行测试。
【解决方案3】:

无法从您的代码的第一个版本反转逻辑。您需要运行整个内部循环才能知道您正在测试的数字是素数。您可能发现它不是提早的质数(让您退出并且不测试其余的潜在除数),但是您无法立即检查质数,您可以在内循环。如果有,你根本不需要循环!

任何“修复”您的第二个代码的努力只会将其转入您开始使用的第一个版本。 更好的素数测试算法,但它们大多要复杂得多,并且会从根本上改变代码的结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多