我是 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)])
我不知道如何让它发挥作用。谁能帮我纠正这个问题吗?
谢谢。
最佳答案
试试这个:
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])
关于Haskell识别算术数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10626531/