2011-04-13 35 views
3

ima newbie to haskell,目前我需要一個函數'f',給定兩個整數,返回它們之間的素數的個數(即大於第一個整數但小於第二個)。haskell,計算列表中有多少個素數

Main> f 2 4 
1 
Main> f 2 10 
3 

這是我的代碼到目前爲止,但它dosent工作。有什麼建議麼?感謝..

f :: Int -> Int -> Int 
f x y 
    | x < y = length [ n | n <- [x..y], y 'mod' n == 0] 
    | otherwise = 0 
+0

'主> F 2 4' '2' 這是我的結果,但你知道,在2到4之間,只有1個素數,3!所以結果假設是1而不是2 ... – sefirosu 2011-04-13 14:34:04

+0

我希望範德姆特教授不會決定設置另一個評估,因爲你的愚蠢和懶惰,不僅自己做評估,而且甚至改變問題... – 2011-04-14 16:49:29

回答

6
  • 從你的例子來看,要在開區間(xy),這在Haskell是表示[x+1 .. y-1]素數。
  • 你的素性測試是有缺陷的;你正在測試因素y
  • 要使用函數名稱作爲中綴運算符,請使用反引號(`),而不是單引號(')。

試試這個:

-- note: no need for the otherwise, since [x..y] == [] if x>y 
nPrimes a b = length $ filter isPrime [a+1 .. b-1] 

讀者練習:實現isPrime。請注意,它只需要一個參數。

+0

好,兩個額外的評論:1. [a + 1,b-1]應該是[a + 1 .. b-1]和2。我認爲提問者故意沒有使用反引號,因爲堆棧溢出會以某種相反的方式將它們解釋爲「像這樣」。 – Tarrasch 2011-04-13 14:38:59

+0

@Tarrasch:1.感謝您的糾正; 2.我認爲,但反引號在代碼塊中工作正常,OP顯然知道如何使用。 – 2011-04-13 14:53:35

+0

對不起,作爲一個noobie ...我真的不明白這是什麼意思'nPrimes a b = length $ filter isPrime [a + 1 .. b-1]'它如何適應我的代碼? – sefirosu 2011-04-13 15:14:30

2

看看你的列表理解是幹什麼的。

n <- [x..y] 

抽獎n的範圍從xy列表。

y `mod` n == 0 

只選擇那些平分y的n

length (...) 

找到有多少這樣的n有。

你目前的代碼是找出x和y(含)之間有多少數字是y的因子。因此,如果您的電子郵件地址爲f 2 4,則列表將爲[2, 4](均勻分配4的數字),並且其長度爲2.如果您的電子郵件地址爲f 2 10,則列表將爲[[2,5,10]](均勻分佈的數字除以10),其長度爲3.

重要的是要自己去了解爲什麼你的代碼不起作用。在這種情況下,這只是錯誤的算法。對於查找數字是否爲素數的算法,在許多其他來源中,您可以檢查wikipedia article: Primality test

0

我想要有大的間隔工作,那麼它可能是一個更好的主意來計算素數列表一次(而不是做每一個號碼的isPrime測試):

primes = -- A list with all prime numbers 
candidates = [a+1 .. b-1] 
myprimes = intersectSortedLists candidates primes 
nPrimes = length $ myprimes