如何解决Haskell:比较序列并计算常见前缀的长度
我是haskell和Im的新手,他写了一个比较两个序列并报告它们共有的前缀长度的函数。这是我到目前为止所拥有的,但并非在所有情况下都适用。
commonLen :: Eq a => [a] -> [a] -> Int
commonLen (x:xs) [] = 0
commonLen (x:xs) (y:ys) | x==y = 1+(commonLen xs ys)
| otherwise = commonLen xs ys
任何想法我哪里出错了?任何帮助将不胜感激
解决方法
如果x
与y
不同,则不应递归。在这种情况下,我们返回0
:
commonLen :: Eq a => [a] -> [a] -> Int
commonLen [] _ = 0
commonLen _ [] = 0
commonLen (x:xs) (y:ys) | x == y = 1 + commonLen xs ys
| otherwise = 0 -- ← return 0
您还可以避免显式递归,并使用:
commonLen :: Eq a => [a] -> [a] -> Int
commonLen xs ys = length (takeWhile id (zipWith (==) xs ys))
在这里,我们同时遍历两个列表,并比较元素。因此,如果两个列表中的元素匹配,我们将创建一个Bool
的列表,即True
。然后,只要项目为takeWhile
,我们就使用True
来获取元素,然后使用length
来确定该列表中元素的数量。由于Haskell的懒惰,如果其中一个元素与另一个列表中的对应元素不同,我们将永远不会评估整个列表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。