簡體   English   中英

我的代碼在哪里破[Python入門]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM