[英]Haskell- how do I walk and compare down the Array/List
我是Haskell的新手,但是其他语言的退伍军人。 (这个问题来自汇编语言练习,但我想在Haskell中解决它。它不是家庭作业或测试题的一部分)
给定:列表中包含值的数组(列表)遵循以下模式:
第一项小于第二项,第二项大于第三项,第三项小于第四项,依此类推,(“波”)。
问题:
1如何在Haskell中解决它? (我知道如何在其他语言中解决它,我可以处理数组索引,但我不知道如何使用函数式语言解决它。
这在Haskell中很容易表达
wave :: (Ord a) => [a] -> Bool
wave xs = and $ zipWith3 ($) (cycle [(<),(>)]) xs (tail xs)
我们也可以在模式上进行简单的参数化
waveLike :: [(a -> a -> Bool)] -> [a] -> Bool
waveLike patterns xs = and $ zipWith3 ($) (cycle patterns) xs (tail xs)
twoUpTwoDown :: (Ord a) => [a] -> Bool
twoUpTwoDown = waveLike [(<),(<),(>),(>)]
coprimeThenNotCoprime :: (Integral a) => [a] -> Bool
coprimeThenNotCoprime = waveLike [coprime, notCoprime]
where coprime m n = gcd m n == 1
notCoprime m n = not (coprime m n)
Probie是一个非常优雅的解决方案,但对于初学者来说,或许基本的递归可能更容易理解。
wave :: (Ord a) => [a] -> Bool
wave [] = True
wave [_] = True
wave [x1,x2] = x1 < x2
wave (x1:x2:x3:xs) = x1 < x2 && x2 > x3 && wave (x3:xs)
四行代码如下:
包含0个元素的列表是波浪状的。
包含1个元素的列表是波浪状的。
如果它增加,则包含2个元素的列表是波浪状的。
具有至少3个以x1,x2,x3
开头的元素的列表是波浪形的iff
x1
和x2
之间“向上”, x2
和x3
之间“向下”, x3
开始(包括x3
)的列表是波浪状的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.