匹配haskell中的数字序列

时间:2017-01-12 16:36:35

标签: haskell numbers sequence

我的任务是匹配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)?

感谢您的帮助:)

3 个答案:

答案 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]