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
相关产品推荐
相关产品推荐

