我的任务是匹配Haskell列表中数字5,7和9的数字序列。列表必须是无限的,以便可以使用以下内容:
需要10个seq [5,7,9,10,14,15,18,20,21,25]
我已经想出如何创建单个数字的无限序列表:
sevens :: [Int]
sevens = sevens : (map (+7) sevens)
这有效,但我如何使用多个数字(在这种情况下为5,7和9)?
感谢您的帮助:)
答案 0 :(得分:1)
这个怎么样
multiples_of_any_of :: [Int] -> [Int]
multiples_of_any_of base = filter (\x -> any (\b -> 0 == mod x b) base ) [1..]
answer::[Int]
answer = multiples_of_any_of [5,7,9]
我将main函数保留为一般形式,因此它可用于获取多个数字的任意组合,而不仅仅是[5,7,9]
,并且作为其定义的一部分,它包含表单中的自然数字的供应[1..]
。最后答案就像上面显示的那样简单
实施例
*Main> take 30 answer
[5,7,9,10,14,15,18,20,21,25,27,28,30,35,36,40,42,45,49,50,54,55,56,60,63,65,70,72,75,77]
(0.00 secs, 0 bytes)
*Main>
*Main> take 10 (multiples_of_any_of [5,13,23])
[5,10,13,15,20,23,25,26,30,35]
(0.00 secs, 933980 bytes)
*Main>
答案 1 :(得分:0)
得到它......几乎
var round = num.toFixed(2);
但是你必须输入自然数列表才能工作。没有任何输入可以吗?
答案 2 :(得分:0)
以前的答案要好得多,但这是一种遵循你的思路的蛮力方法。
merge :: [[Integer]] -> [Integer]
merge all@[(a:as), (b:bs), (c:cs)] = let min = minimum [a, b, c]
in min : (merge (map (dropMin min) all))
where dropMin m (x:xs)
| x == m = xs
| otherwise = (x:xs)
> take 15 $ merge [[5, 10 .. ], [7, 14 ..], [9, 18 ..]]
[5,7,9,10,14,15,18,20,21,25,27,28,30,35,36]