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

Haskell递归无高阶函数实现列表拆分为相邻相同元素子列表

错误原因
  • 边界条件错误:空列表的返回值定义为[[]],会导致最终输出末尾多余一个空列表,空分支正确返回值应为[]。
  • 元素丢失问题:采用(x:y:rest)模式拆分列表时,若x与y不相等,你直接递归处理rest,会直接丢弃中间元素y,例如输入[1,2,3]会得到错误结果[[1],[3]]。
  • 合并逻辑错误:当相邻元素x与y相等时,你直接将[x]作为独立子列表拼接在递归结果前,没有将相等的相邻元素合并到同一个子列表中,例如输入[1,1]会得到[[1],[1]]而非预期的[[1,1]]。
修正方案

调整递归逻辑为:先递归处理当前元素的尾部列表,再判断当前元素是否和递归结果第一个子列表的首元素相等,相等则合并到该子列表头部,否则作为新的子列表插入到结果头部,全程不使用高阶函数,纯递归实现。
修正后代码如下:

breakList :: [Int] -> [[Int]]
breakList [] = []
breakList [x] = [[x]]
breakList (x:xs) = let (firstSub:restSub) = breakList xs
                   in if x == head firstSub
                      then (x : firstSub) : restSub
                      else [x] : firstSub : restSub
效果验证

输入示例[1,1,2,4,5,5],运行后输出为[[1,1],[2],[4],[5,5]],符合预期。

内容的提问来源于stack exchange,提问作者Bohdan Chornopolskyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:03:01