任务是生成数字列表,其数字仅为2,4,6。
Example2,4,6,22,24,26,42,44,46,62,64,66,222,224,226,...
我已经通过暴力解决了这一任务:
numberHasOnly246 :: Integer -> Bool
numberHasOnly246 0 = False
numberHasOnly246 n = result
where
result = helper True (abs n)
helper :: Bool -> Integer -> Bool
helper result n
| (div n 10 == 0) = condition && result
| (div n 10 > 0) = helper (condition && result) (div n 10)
where
condition = mod n 10 == 4 || mod n 10 == 6 || mod n 10 == 2
series246 :: [Integer]
series246 = numbers[1..]
where
numbers(e : ls) = e : (numbers [ x | x <- ls, (numberHasOnly246 x == True)])但这个解决方案似乎太慢了。另外,我读过,在Haskell中有打结方法来生成无限列表,但是在这里我找不到如何通过打结来解决它。这种方法在这里合适吗?
发布于 2020-11-15 19:31:58
与生成和测试方法不同,您只能生成有效的数字.
因此,对于一位数,这是:
digits :: [Int]
digits = [2, 4, 6]对于数字,我们可以在这里使用递归:
numbers = [ 10*t + d | t <- (0:numbers), d <- digits ]这里,t是我们乘以10的值,我们从0开始。d是我们随后可以附加的数字。因此,这使我们:
Prelude> numbers
[2,4,6,22,24,26,42,44,46,62,64,66,222,224,226,242,244,246,262,264,266,422,424,426,442, …https://stackoverflow.com/questions/64848857
复制相似问题