Haskell程序,它给出了漂亮的素数

Haskell程序,它给出了漂亮的素数,haskell,Haskell,我制作了一个haskell程序,可以计算出漂亮的素数。美丽素数是非常接近2的幂的素数。你给2个数字,例如:10和20,然后它返回17,因为17是最接近2的幂。17-16=1,因此它是最接近的 我做了这个: 编辑:我已经像这样重写了primefunction和e verw函数,但仍然得到-1 -- Geeft priemgetallen terug tussen de 2 grenzen -- English: Gives primenumbers between 2 numbers prie

我制作了一个haskell程序,可以计算出漂亮的素数。美丽素数是非常接近2的幂的素数。你给2个数字,例如:10和20,然后它返回17,因为17是最接近2的幂。17-16=1,因此它是最接近的

我做了这个:

编辑:我已经像这样重写了primefunction和e verw函数,但仍然得到-1

  -- Geeft priemgetallen terug tussen de 2 grenzen
-- English: Gives primenumbers between 2 numbers
priemgetallen :: Int->[Int]
priemgetallen b = take b (zeef [2..])
    where zeef (p:xs) = p : zeef [x | x<-xs, (mod x p) /= 0]

-- Geeft machten terug tussen de 2 grenzen
-- English: Gives powers of 2 between 2 numbers
machten :: Int->Int->[Int]
machten a b 
        | a <= 2 = 2:[2^x| x<-[2..b], (2^x) `mod` 2 == 0, 2^x < b, 2^x > a]
        | otherwise = [2^x| x<-[2..b], (2^x) `mod` 2 == 0, 2^x < b, 2^x > a]

-- English: the start of the function
prettyprime :: Int->Int->Int
prettyprime a b = vergelijk ( verw a (priemgetallen b)) (machten a b)

-- Filter the list
verw :: Int->[Int]->[Int]
verw _ [] = []
verw k (x:xs)
    | x > k = [x] ++ verw k xs
    | otherwise = verw k xs

-- Vergelijkt alle priemgetallen en geeft welke korste bij het ander ligt
-- English this function must see what primenumber is the closest to a power of 2 but I can't fix it
vergelijk :: [Int]->[Int]->Int
vergelijk [] _ = -1
vergelijk _ [] = -1
vergelijk (x:xs) (y:ys)
            | x - y < vergelijk (x:xs) ys = x
            | x - y > vergelijk (x:xs) ys = vergelijk xs (y:ys)
            | x - y == vergelijk (x:xs) ys = x




main = do
       print $ prettyprime 14 20
——格伦森2号吉夫特·普里姆盖塔伦·特鲁格·图森
--中文:给出两个数字之间的素数
priemgetallen::Int->[Int]
priemgetallen b=取b(zeef[2..])
其中zeef(p:xs)=p:zeef[x | xInt->[Int]
马腾a b
|整数->整数
预犯罪a b=vergelijk(verw a(priemgetallen b))(machten a b)
--筛选列表
verw::Int->[Int]->[Int]
verw[]=[]
verw k(x:xs)
|x>k=[x]++verwkxs
|否则=verw k xs
--这是一个很好的例子
--这个函数必须知道什么素数最接近2的幂,但我不能修正它
vergelijk::[Int]->[Int]->Int
vergelijk[].=-1
vergelijk[]=-1
(x:xs)(y:ys)
|x-yvergelijk(x:xs)ys=vergelijk-xs(y:ys)
|x-y==k(x:xs)ys=x
main=do
打印$PretyPrime 14 20
有人能帮我吗


善意的问候,

不完整的模式是因为您忽略了当
x-y==vergelijk(x:xs)ys
时的情况。如果您添加
-fwarn不完整的模式
,并将您的保护转换为真实的
案例
,编译器可以就此向您发出警告:

vergelijk (x:xs) (y:ys) = case compare (x - y) (vergelijk (x:xs) ys) of
    LT -> x
    -- you will get a warning about having no case for EQ
    GT -> vergelijk xs (y:ys)

另外,此版本重新计算递归调用的可能性要小得多,尤其是在低优化级别上。

不完整的模式是因为您忽略了当
x-y==vergelijk(x:xs)时的情况ys
。如果您添加
-fwarn不完整的模式
,并将您的防护装置转换为真实的
案例,编译器将对此发出警告:

vergelijk (x:xs) (y:ys) = case compare (x - y) (vergelijk (x:xs) ys) of
    LT -> x
    -- you will get a warning about having no case for EQ
    GT -> vergelijk xs (y:ys)

作为奖励,此版本不太可能重新计算递归调用,尤其是在低优化级别上。

能否更具体地说明您的问题是什么?vergelijk函数不起作用。它具有非穷举模式。我看不出问题:(.该函数只需要比较素数列表和2的幂,看看哪个素数最接近2的幂。因此,在10 en 20之间,它应该给出17。如果没有接近2的幂的素数,那么它给出-1。您可能需要检查
priemgetallen
函数-
priemgetallen 10 20
返回
>[11,13,15,17,19]
和15不是素数。15和17同样接近16,因此您的函数也可以合理地返回15…事实上,这就是问题所在:s。我需要重写此:)谢谢。你能更具体地说明你的问题是什么吗?vergelijk函数不起作用。它有一个非穷举模式。我看不出问题:(.该函数只需要比较素数列表和2的幂,看看哪个素数最接近2的幂。因此,在10 en 20之间,它应该给出17。如果没有接近2的幂的素数,那么它给出-1。您可能需要检查
priemgetallen
函数-
priemgetallen 10 20
返回
>[11,13,15,17,19]
和15不是素数。15和17同样接近16,因此您的函数也可以合理地返回15…事实上,这就是问题所在:s。我需要重写此:)谢谢。谢谢。我没有注意到它们相等的情况。现在它给了我10到20之间的数字11,因为它没有在整个列表上循环:s,haskell让我头疼:DThanks。我没有注意到它们相等的情况。现在它给了我10到20之间的数字11,因为它没有在整个列表上循环:s,haskell让我头痛:D