Haskell使用模式匹配递归实现列表连续相同元素计数
Haskell 相邻相等元素计数实现方案
原代码问题分析
你的初始实现逻辑存在偏差:mrn xs 返回的是计数数值,不能直接和当前元素 x 做相等判断,你需要比较的是当前元素和列表下一个元素的值。此外你需要额外的状态存储「当前连续计数」和「历史计数/最大计数」,可以通过内部辅助递归函数传递这些状态,不需要对外暴露参数。
实现1:返回最长连续相等元素的长度
如果你需要的是统计列表中最长的连续相等元素个数,代码如下:
maxRepeatNum :: Eq a => [a] -> Int -- 空列表边界处理 maxRepeatNum [] = 0 -- 非空列表调用辅助函数,初始状态:上一个元素为首个元素、当前连续计数为1、历史最大计数为1 maxRepeatNum (x:xs) = helper x 1 1 xs where -- 辅助函数参数依次为:上一个遍历元素、当前连续计数、历史最大计数、剩余待遍历列表 helper _ curMax totalMax [] = max curMax totalMax helper prev curMax totalMax (y:ys) -- 相邻元素相等:当前计数+1,更新历史最大值 | y == prev = helper y (curMax + 1) (max (curMax + 1) totalMax) ys -- 相邻元素不等:当前计数重置为1,历史最大值保持不变 | otherwise = helper y 1 totalMax ys
测试示例
maxRepeatNum [1,1,2,2,2,3,3]输出3maxRepeatNum "aabbbccddddd"输出5maxRepeatNum [4]输出1maxRepeatNum []输出0
实现2:返回所有连续相等段的计数列表
如果你需要存储每一段连续相等的计数值,输出所有计数组成的列表,代码如下:
repeatNumList :: Eq a => [a] -> [Int] repeatNumList [] = [] repeatNumList (x:xs) = helper x 1 xs where helper _ cur [] = [cur] helper prev cur (y:ys) | y == prev = helper y (cur + 1) ys | otherwise = cur : helper y 1 ys
测试示例
repeatNumList [1,1,2,2,2,3]输出[2,3,1]repeatNumList "aabbc"输出[2,2,1]
内容的提问来源于stack exchange,提问作者Niki
相关产品推荐
相关产品推荐

