[英]Where is my code breaking [Beginner Python]
我正在嘗試返回所有素數到一定數量的列表(如果是針對Euler問題7的話)。 我是Python的新手,但我的問題似乎不是語言,而是邏輯錯誤。
import math
import sys
def is_prime(n):
if n%2 == 0:
return False
for i in range(3, int(math.sqrt(n))+1, 2):
if n%i == 0:
return False
return True
def prime_counter(n):
result = [2]
while len(result) < n:
for i in range(3, sys.maxsize, 2):
if is_prime(i):
result.append(i)
break
return result
print (prime_counter(6))
打印[2、3、3、3、3、3]。 為什么不增加i並評估列表中的新數字? 為什么它總是加3?
每次找到第一個質數(3)時, break
語句都會在函數prime_counter
退出for
循環。 然后,它從頭開始重新啟動for
循環,從數字3開始,它再次發現是質數。
例如,您需要使用一個while
循環並自己增加候選變量,然后在找到足夠的素數時中斷循環。
擺脫while循環,而是測試每個新發現的素數的result
長度:
def prime_counter(n):
result = [2]
for i in range(3, sys.maxsize, 2):
if is_prime(i):
result.append(i)
if len(result) == n: return result
您的中斷聲明似乎是問題所在。 在for循環的第一個周期中,設置i = 3,確認i小於sys.maxsize,然后檢查i是否為素數。 是的,所以我們做if語句的主體。 它將i附加到您的結果集中,然后脫離for循環。 注意,我們永遠不會回到for循環的頂部,在這里我將i遞增2。我們將i保留在3。在退出for循環之后,我們檢查while語句的條件,並確認結果集仍然小於n,因此我們重新開始for循環,從3開始i,檢查3是否小於sys.maxsize,依此類推。您永遠不會繞過遞增i。
代替雙循環,您應該只使用for循環,並在每次成功追加后,檢查結果集的新長度是否等於n,如果是,則退出循環。 完全擺脫while循環。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.