输出可被Y和Z Haskell整除的整数列表

时间:2018-06-03 14:37:50

标签: list haskell

我正在尝试编写一个函数,该函数将输出一个可被Y和Z整除的整数列表,从1到500.但是我得到一个空列表。我究竟做错了什么?

divisByYnZ :: Int -> Int -> [Int]
divisByYnZ y z = [x | x <- [1..500], y `mod` 2 == 0 && z `mod` 2 == 0]

1 个答案:

答案 0 :(得分:4)

x的情况下,数字y可以被mod x y == 0整除。如果您希望数字可以被y整除,那么您应该将过滤器y `mod` 2 == 0重写为x `mod` y == 0(此处x是您想要过滤的数字),或更紧凑的mod x y == 0

所以我们可以将其重写为:

divisByYnZ y z = [x | x <- [1..500], mod x y == 0, mod x z == 0]

优化发电机

然而这不是很有效:假设y100,那么这意味着我们将在其中一个元素匹配之前每次生成一百个元素。因此,我们首先要做好准备&#34;生成器只生成可被y整除的数字。哪个是[y, y+y..500](我们在此假设y 严格为正):

-- given y is strictly positive
divisByYnZ y z = [x | x <- [y, y+y..500], mod x z == 0]

将两个模数检查与最小公倍数

组合

当且仅当它可被最小公倍数(LCM)整除时,一个数字除以两个数字ab。在Haskell中,前奏有一个函数lcm :: Integral i => i -> i -> i,用于计算最小公倍数。因此,我们可以将列表理解重写为:

-- given y and z are strictly positive
divisByYnZ y z = [t, t+t..500]
    where t = lcm y z