haskell - 在 Haskell 中返回一个数字的所有素数的函数
问题描述
我有一个预定义的函数“ primes
”,它返回所有素数的无限列表。我为函数“”编写了以下代码,prime_factors n
以返回其所有因子n
也是素数。
prime_factors n = [x | x<-primes, n `mod` x == 0]
在执行prime_factors 12
时它给了我正确的输出[2,3
,但在没有输出之后继续执行。为什么会发生这种情况,我该如何阻止它?
作为参考,这是整个代码段:
primes :: [Integer]
primes = f [2..] where f (p:xs) = p: f [x | x <- xs, x mod p/=0] f [] = []
prime_factors n = [x | x<-primes, n mod x == 0, x*2 <= n]
解决方案
primes :: Int -> [Integer]
primes n = take n $ f [2..]
where f (p:xs) = p: f [x | x <- xs, x `mod` p/=0]
prime_factors :: Int -> [Integer]
prime_factors n = [x | x<-primes n, n `mod` fromIntegral x == 0]
这不是一个漂亮的解决方案(我自己对 Haskell 来说相对较新),但它通过使用该take
函数来阻止程序无限期运行,以确保您永远不会获得比有限数量的条目更多的条目n
,根据定义,这将是很远的比你需要的多,因为在给定阈值之前,素数总是比自然数少,即length [2,3] < length [1,2,3]
等。
希望其他人可以为您提供更优雅的解决方案。但这一个有效。
推荐阅读
- r - 列从“WinorLoss”更改为“Class”
- python-3.x - 尝试创建线程并在它们之间设置管道时,“str”对象不可调用错误
- android - 如何在 android 中为 notch 设备获取安全区域
- javascript - 使用自定义 api 挂钩时获取“arr [Symbol.iterator] 不是函数”
- bash - 根据过滤器列出特定的 git 分支
- javascript - 为什么随机类的构造函数等于原生 Function 对象?
- java - 序列化和反序列化具有相同名称的 Jackson XML 元素
- node.js - 填充更多的猫鼬集合字段导致节点js api中的响应时间延迟
- azure - Azure DevOps REST API - 从每个成员获取容量栏
- android - Android如何创建隐藏文件?