Haskell识别算术数列

标签 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)])

我不知道如何让它发挥作用。谁能帮我纠正这个问题吗?

谢谢。

最佳答案

试试这个:

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/

相关文章:

haskell - 动态加载已编译的 Haskell 模块 - GHC 7.6

haskell - Haskell 中 lambda 的位置

haskell - 在 Haskell 中添加列表的惯用方法是什么?

haskell - 如何在 Haskell 中将列表的长度返回为 Integer 而不是 Int 类型

haskell - Stack (Haskell) 使用 GitHub Actions 构建源文件缓存

haskell - 如何跨模式匹配执行 where 子句

Haskell 导出大量函数

haskell - GHC 提示重叠的实例,而实际上它们不是

haskell - 有人看过棘手的 Haskell 练习列表吗?