首页 > 解决方案 > 在 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]

标签: haskelloutputprimesfreezeprime-factoring

解决方案


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]等。

希望其他人可以为您提供更优雅的解决方案。但这一个有效。


推荐阅读