我正在尝试编写一个函数,该函数将输出一个可被Y和Z整除的整数列表,从1到500.但是我得到一个空列表。我究竟做错了什么?
divisByYnZ :: Int -> Int -> [Int]
divisByYnZ y z = [x | x <- [1..500], y `mod` 2 == 0 && z `mod` 2 == 0]
答案 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]
然而这不是很有效:假设y
是100
,那么这意味着我们将在其中一个元素匹配之前每次生成一百个元素。因此,我们首先要做好准备&#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)整除时,一个数字除以两个数字a
和b
。在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