Haskell中如何为函数提供前51个素数的指定范围输入
Haskell代码修改方案
完全可以实现自动生成前51个素数输入的需求,无需手动逐一键入,修改后的代码如下:
-- 埃氏筛实现无穷素数序列 primes :: [Integer] primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0] perfect_nums n = (2^(n-1)) * ((2^n) - 1) -- 取前51个素数作为输入参数 fperfect_nums = [perfect_nums x | x <- take 51 primes] main = print fperfect_nums
代码说明
- 我们用经典的埃拉托斯特尼筛法实现了惰性求值的无穷素数序列
primes,只会在需要时生成对应位置的素数,运行效率高 - 用
take 51 primes直接获取前51个从小到大的素数,完全替换原代码中手动输入的素数列表,运行结果和原代码完全一致 - 如果后续需要调整使用的素数数量,仅需修改
take后的数字即可,无需手动维护素数列表
补充说明:你当前使用的
perfect_nums函数是欧几里得完全数公式,仅当参数n为梅森素数时输出结果才是完全数,如果你最终目标是生成完全数,可以将素数序列替换为梅森素数序列即可,上述方案已经完全满足你当前提出的自动生成前51个素数输入的需求。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

