繁体   English   中英

Haskell-我如何走向并比较阵列/列表

[英]Haskell- how do I walk and compare down the Array/List

我是Haskell的新手,但是其他语言的退伍军人。 (这个问题来自汇编语言练习,但我想在Haskell中解决它。它不是家庭作业或测试题的一部分)

给定:列表中包含值的数组(列表)遵循以下模式:

第一项小于第二项,第二项大于第三项,第三项小于第四项,依此类推,(“波”)。

问题:

1如何在Haskell中解决它? (我知道如何在其他语言中解决它,我可以处理数组索引,但我不知道如何使用函数式语言解决它。

  1. 答案可以推广,以便解决其他模式吗?

这在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

  1. 我们在x1x2之间“向上”,
  2. 我们在x2x3之间“向下”,
  3. x3开始(包括x3 )的列表是波浪状的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM