2015-02-10 45 views
1

因此,我試圖找到第6個質數,並且getPrime中的while循環無法正常工作。當count大於num時,它應該結束,但它不會。 如果你能幫我找出原因,那會很好。while循環在Python中不能正常工作

import math 

def isPrime(num): 
    if num == 1: 
     return False 
    if num % 2 == 0 and num > 2: 
     return False 
    for i in range(3, int(math.sqrt(num))+1, 2): 
     if num % i == 0: 
      return False 
    return True 

def getPrime(num): 
    count = 1 
    while count < num: 
     for i in range(1, 20): 
      #print "check" 
      if isPrime(i): 
       print "prime", i 
       count += 1 
       print "count", count 
      else: 
       continue 
    print i 
    return i 

getPrime(6) 
+0

因此,在短期你想知道有多少素數是0和num或獲得之間在一定範圍內的最高質數:像

試試?爲什麼只在數組[1,20]中尋找素數? – Beri 2015-02-10 08:14:16

+1

爲什麼你完全使用範圍(1,20)? – 1Darco1 2015-02-10 08:14:41

+2

另外,當函數結束時,「i」可能還沒有被定義/初始化。 – 1Darco1 2015-02-10 08:17:07

回答

0

你只是在結尾部分的循環檢查計數的值,以便你將永遠結束正在測試的1-20的全部範圍。爲什麼範圍限制在20?

根本不需要for循環。使用while循環繼續查找素數,直到您有num

def getPrime(num): 
    count = 0 
    i = 1 
    highPrime = None 
    while count < num: 
     if isPrime(i): 
      count += 1 
      highPrime = i 
     i += 1 
    return highPrime 
2

getPrime()功能,當isPrime(i)回報False,你是不是遞增count變量。所以while count < num循環卡住了這一點。

更新:那麼,這是我從查看代碼的第一印象。但後來我注意到了嵌套循環。所以我可能誤解了發生的事情。

我現在推薦的是在調試器中單步執行代碼,這樣你就可以看到發生了什麼。你有Python調試器嗎?

如果你有一個好的調試器並知道如何使用它,你可以自己回答幾乎所有這樣的問題。然後,您不必等待Stack Overflow上的朋友對發生了什麼問題進行猜測! :-)

2

原因是因爲您的範圍說明在while語句的主體內。在另一種語言中,你可以使用do ... until語句,但在Python中,實現它的方法只是添加一個條件break語句,例如我糾正了代碼:

def getPrime(num): 
    count = 1 
    for i in range(1, 20): 
     if count > num: break 
     if isPrime(i): 
      highestPrime = i 
      count += 1 
    return highestPrime 
+1

我已經提出了你的答案,但它仍然不完全正確。在循環前添加一個'highestPrime'變量,並且每當我是一個素數時將它的當前值賦給它。然後你可以返回'highestPrime'而不是我可能沒有價值的。 – 1Darco1 2015-02-10 08:29:14

+0

謝謝,你說得對。 – Wes 2015-02-10 08:45:48

0

簡化getPrime,沒有必要爲一個while循環:

def getPrime(num, r): 
    gen = (i for i in r if isPrime(i)) 
    primes = zip(*zip(range(num), gen))[1] 
    return primes[num-1] if len(primes) >= num else None 

>>> print getPrime(6, xrange(1, 20)) 
13 
>>> print getPrime(6, xrange(100, 500)) 
127