如何解决根据元组的总和在Haskell中找到最大对
我目前对Haskell编程完全陌生,老实说,我完全迷路了。我当前的问题是试图弄清楚如何在元组列表中获取最大元素。
示例:
给出一个列表[(2,4),(7,5),(2,1),(3,4)]根据元组的总和找到最大对。 在这种情况下,答案是(7,5),因为7 + 5 = 12,它大于所有其他总和。
当前,这是我拥有的代码:
maximumPair [] = error "List needs at least one element"
maximumPair ((x,y):[]) = [(x,y)]
maximumPair ((x,y):xys) = maxPair
where maxPair currentMax[] = currentMax
| sum [x,y] > currentMax = maxPair xys
| otherwise = (x,y) : maxPair
我倾向于不断地获得解析错误,并且就语法而言通常只是做错了事。如果有人可以帮助,将不胜感激。
解决方法
不要惊慌。您肯定在正确的轨道上。让我们视情况进行研究。
空列表
的确,如果您的配对列表为空,则没有最大值:
maximumPair [] = error "maximumPair: empty list"
非空列表
如果列表中至少有一个元素,我们将遍历列表,同时跟踪到目前为止遇到的最高总和的货币对。我们使用辅助函数go
实现此遍历,该函数带有两个参数:(1)到目前为止遇到的总和最高的对(“候选”),以及(2)列表中仍有待遍历的部分。开始遍历时,我们从列表中的第一个元素中选出第一个元素:这是我们遇到的第一个对,因此肯定是到目前为止遇到的总和最大的对:
maximumPair (pair : pairs) = go pair pairs
遍历
执行遍历的函数go
是列表的常规递归函数。在递归的每个步骤中,我们测试新遇到的对是否具有比候选者更高的总和:如果有,则新遇到的对成为候选;否则,我们将保持候选人不变。如果我们到达列表的末尾,则将候选对象确定为最大元素,并将其作为函数结果返回。为了比较对的总和,我们使用了辅助函数lt
(“小于”)。
go candidate [] = candidate
go candidate (pair : pairs) | candidate `lt` pair = go pair pairs
| otherwise = go candidate pairs
lt (m,n) (p,q) = m + n < p + q
总结
maximumPair
的完整定义现在显示为:
maximumPair :: (Num a,Ord a) => [(a,a)] -> (a,a)
maximumPair [] = error "maximumPair: empty list"
maximumPair (pair : pairs) = go pair pairs
where
go candidate [] = candidate
go candidate (pair : pairs) | candidate `lt` pair = go pair pairs
| otherwise = go candidate pairs
lt (m,q) = m + n < p + q
测试它会得到:
> maximumPair [(2,4),(7,5),(2,1),(3,4)]
(7,5)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。