列表中的序列号哈斯克尔



我是Haskell的新手,我正在尝试一些我以前为java完成的编码问题,但是以下问题让我感到困惑。

基本上,这个想法是编写一个函数,该函数接收整数列表([Int](来确定整数列表中是否有连续的1。例如,以下内容的输出将是:输入: 函数 [0,0,1,1,0]输出:真

Haskell中此问题的示例解决方案将不胜感激,谢谢

一种方法是使用模式匹配在列表的开头查找连续的,然后向下推进列表,直到找到它们,或者用完要查看的元素。

consecutiveOnes [] = False
consecutiveOnes (1:1:_) = True
consecutiveOnes (_:xs) = consecutiveOnes xs

这是一个解决方案:

consecutiveOnes :: [Int] -> Bool
consecutiveOnes xs = auxOnes False xs
auxOnes :: Bool -> [Int] -> Bool
auxOnes b [] = False
auxOnes b (x:xs) = case (x==1 && b) of {
    True -> True;
    False -> auxOnes (x==1) xs;
};

另一种方法是使用 isInfixOf 方法并询问 [1,1] 是否出现在列表中的任何位置:

consecutiveOnes :: [Int] -> Bool
consecutiveOnes xs = isInfixOf [1,1] xs

isInfixOf 函数接受两个列表并返回 True iff 第一个列表包含在第二个内的任何位置,完全且完整。

但我相信还有很多其他方法可以做到这一点。

你也可以这样做:

consecutiveOnes [] = False
consecutiveOnes xs = any (== (1,1)) $ zip xs (tail xs)

如果

 xs == [0,1,1,2,3,4]

然后

tail xs == [1,1,2,3,4]

将它们压缩在一起,你会得到一个对列表,其中每个对都是列表的一个元素,后面是元素。

zip xs (tail xs) == [(0,1),(1,1),(1,2),(2,3),(3,4)]

最新更新