You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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] 输出 3
  • maxRepeatNum "aabbbccddddd" 输出 5
  • maxRepeatNum [4] 输出 1
  • maxRepeatNum [] 输出 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:15:00