在k-composite数的Haskell中创建无限列表

Mat*_*ins 3 haskell function list

k-复合数是具有除了1和其自身之外的k个因子的复合数.我正在尝试编写将采用整数k的代码并返回所有k-composite的无限列表.所以使用take 5 $ kcomposite 2将返回[6,8,10,14,15].我写了两个函数来完成这个:

factors :: Int -> [Int]
factors n = [x | x <- [1..n], n `mod` x == 0]

kcomposite ::  Int -> [Int]
kcomposite n = [x | x <- [1..], (length (factors n)) == (x-2)]
Run Code Online (Sandbox Code Playgroud)

我编译没有问题,但是当我尝试运行它们时,ghci永远不会停止运行.这是有道理的,因为无限列表,但即使我只尝试获取列表中的前几个元素,就像在上面的例子中一样.我无法理解我做错了什么.

Igo*_*dov 5

k-复合数是具有除了1和其自身之外的k个因子的复合数

由于您的factors函数返回数字的所有因子(包括1它自身),因此该数字将大于提供的数字k.这就是为什么你需要比较k + 2而不是k - 2

此外,当k小于0你仍然会让程序永远不会停止运行时,这就是你可能想要处理这个边缘情况的原因.

factors :: Int -> [Int]
factors n = [x | x <- [1..n], n `mod` x == 0]

kcomposite ::  Int -> [Int]
kcomposite k
  | k < 0 = []
  | otherwise = [x | x <- [1..], length (factors x) == (k + 2)]
Run Code Online (Sandbox Code Playgroud)