List 列表中的序列号haskell

List 列表中的序列号haskell,list,loops,haskell,List,Loops,Haskell,我是haskell的新手,我尝试了一些以前为java完成的编码问题,但是下面的问题让我难住了 其基本思想是编写一个函数,该函数接受一个整数列表([Int]),确定一个整数列表中是否有连续的1。例如,以下内容的输出为: 输入:func[0,0,1,1,0] 输出:真 如能在haskell提供此问题的示例解决方案,将不胜感激, 谢谢这是一个解决方案: consecutiveOnes :: [Int] -> Bool consecutiveOnes xs = auxOnes False xs

我是haskell的新手,我尝试了一些以前为java完成的编码问题,但是下面的问题让我难住了

其基本思想是编写一个函数,该函数接受一个整数列表([Int]),确定一个整数列表中是否有连续的1。例如,以下内容的输出为: 输入:func[0,0,1,1,0] 输出:真

如能在haskell提供此问题的示例解决方案,将不胜感激, 谢谢

这是一个解决方案:

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;
};
另一种方法是使用并询问[1,1]是否出现在列表中的任何位置:

consecutiveOnes :: [Int] -> Bool
consecutiveOnes xs = isInfixOf [1,1] xs
isInfixOf函数接受两个列表,并在第一个列表中返回True 清单完整无缺地包含在第二个范围内的任何地方


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

一种方法是使用模式匹配来查找列表顶部的连续元素,然后沿着列表向下推进,直到找到它们,或者您没有要查看的元素

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

您也可以这样做:

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

然后

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

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

您尝试过什么了吗?关于逻辑:检查空列表或单例并返回false,如果第一个元素为0,则检查列表的其余部分是否有序列,如果第一个元素为1,则检查第二个元素是否有1并返回true,否则从第三个元素检查列表
def sequenceones list如果list=[]则为false;否则,如果(尾部列表)=[],则为false;else if(head list)==0然后(sequeceones(tail list))else if(head list)==1然后if(head(tail list))==1然后true-else(sequeceones(tail(tail list))
我的问题是我不知道如何用haskell编写它,非常棒,肯定比我的方法要简洁得多,谢谢你。我刚刚添加了一个新的方法更简洁,但是检查Data.List方法,因为有任何方法可以做到这一点
tail xs == [1,1,2,3,4]
zip xs (tail xs) == [(0,1),(1,1),(1,2),(2,3),(3,4)]