首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出数字,其数字仅为2,4,6

列出数字,其数字仅为2,4,6
EN

Stack Overflow用户
提问于 2020-11-15 19:26:39
回答 1查看 82关注 0票数 1

任务是生成数字列表,其数字仅为2,4,6。

Example2,4,6,22,24,26,42,44,46,62,64,66,222,224,226,...

我已经通过暴力解决了这一任务:

代码语言:javascript
复制
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中有打结方法来生成无限列表,但是在这里我找不到如何通过打结来解决它。这种方法在这里合适吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-15 19:31:58

与生成和测试方法不同,您只能生成有效的数字.

因此,对于一位数,这是:

代码语言:javascript
复制
digits :: [Int]
digits = [2, 4, 6]

对于数字,我们可以在这里使用递归:

代码语言:javascript
复制
numbers = [ 10*t + d | t <- (0:numbers), d <- digits ]

这里,t是我们乘以10的值,我们从0开始。d是我们随后可以附加的数字。因此,这使我们:

代码语言:javascript
复制
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, …
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64848857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档