2

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

我不知道如何使它工作。谁能帮我纠正这个?

谢谢。

4

1 回答 1

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])
于 2012-05-16T21:08:14.340 回答