【问题标题】:haskell, counting how many prime numbers are there in a listhaskell,计算列表中有多少个素数
【发布时间】:2011-08-04 18:25:35
【问题描述】:

我是 Haskell 的新手,目前我需要一个函数“f”,给定两个整数,返回它们之间的素数个数(即大于第一个整数但小于第二个整数)。

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

到目前为止,这是我的代码,但它不起作用。有什么建议?谢谢..

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

【问题讨论】:

  • Main&gt; f 2 4 2 这是我的结果,但你知道,在 2 和 4 之间,只有 1 个质数,3!所以结果假设是 1 而不是 2... .
  • 我希望 van Deemter 教授不要因为你愚蠢和懒惰而决定设置另一个评估,不仅自己做评估,甚至改变问题......

标签: list function haskell primes


【解决方案1】:
  • 从您的示例来看,您需要开区间 (x,y) 中的素数数,在 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。请注意,它只需要一个参数。

【讨论】:

  • 好,两个额外的 cmets:1. [a+1, b-1] 应该是 [a+1 .. b-1],以及 2. 我认为提问者故意没有使用反引号,因为堆栈溢出会以某种相反的方式解释它们like this
  • @Tarrasch: 1. 感谢指正; 2. 我考虑过,但反引号在代码块中工作正常,OP 显然知道如何使用。
  • 对不起,我是个菜鸟...我真的不明白这是什么意思 nPrimes a b = length $ filter isPrime [a+1 .. b-1] 它有多适合我的代码?
  • nPrimes ab = 计算 a 和 b 之间素数的函数 / isPrime = 一个(尚未编写)测试一个数是否为素数的函数 / filter = 一个过滤这些元素的标准函数满足谓词的列表(例如 isPrime)/长度 = 给出列表长度的标准函数,在这种情况下,是 a 和 b 之间的素数列表的长度,这是 nPrimes 的结果。
  • 你需要写 isPrime。但是如果你有它,你也可以用 isPrime n 替换你的列表理解中的守卫
【解决方案2】:

看看你的列表理解是做什么的。

n <- [x..y]

xy 的列表中绘制n。

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

【讨论】:

    【解决方案3】:

    如果您想使用较大的间隔,那么最好计算一次素数列表(而不是对每个数字进行 isPrime 测试):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多