我必须编写一个函数,它返回所有对 (x,y) 的列表,其中 x, y ∈ N和:
- x 是两个自然数的乘积 (x = a • b, 其中 a, b ∈ N)并且
- x 确实大于 5 但确实小于 500,并且
- y 是一个不大于 1000 的平方数 (y = c² 其中 c ∈ N),并且
- x 是 y 的除数。
我的尝试:
listPairs :: [(Int, Int)]
listPairs = [(a*b, y) | y <- [0..], a <- [0..], b <- [0..],
(a*b) > 5, (a*b) < 500, (y*y) < 1001,
mod y (a*b) == 0]
但它不会返回任何东西,并且计算机在它上面工作了很多。
a
但是,如果我为,b
和y
eg选择较小的范围[0..400]
,则最多需要一分钟,但它会返回正确的结果。
那么我该如何解决性能问题呢?