Haskell识别算术序列

时间:2012-05-16 20:53:44

标签: haskell

我是Haskell的新手,我有一个小问题。 我正在尝试编写一个函数来识别列表是否是算术序列。

我有这个不工作的代码:

isArithmSeq :: [Int] -> Bool
isArithmSeq [] = False;
isArithmSeq [x] = False;
isArithmSeq [x,y] = True;
isArithmSeq (x:y:xs) = (sum (x:y:xs)) == (sum [x,y..(last xs)])

我不知道如何让它发挥作用。任何人都可以帮我纠正这个吗?

THX。

1 个答案:

答案 0 :(得分:2)

试试这个:

isArithmSeq :: [Int] -> Bool
isArithmSeq [] = False
isArithmSeq [x] = False
isArithmSeq [x,y] = True
isArithmSeq (x:y:z:xs) = (x - y) == (y - z) && isArithmSeq (y:z:xs)

您已为递归定义定义了一个很好的基本案例。现在,您只需要检查连续元素之间的差异是否始终相同。

的原因
isArithmSeq (x:y:xs) = (sum (x:y:xs)) == (sum [x,y..(last xs)])

不起作用是因为总和不是算术序列的唯一要求:

(sum [2,3,4,0,11,7]) == (sum [2,3,4,5,6,7])