我是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)]