我的Haskell longestChain函数无法正常运行,需修改哪些代码?
问题排查与修复方案
原有代码核心问题
- 缺少边界处理:没有定义空字符串、长度为1的字符串的返回值,输入长度<2的字符串时会直接报错
- 未记录历史最大长度:现有逻辑只会累加当前连续相同字符的长度,遇到字符变化时会直接丢弃之前的连续长度记录,无法和后续新的连续串长度做比较,比如输入
"11111222"时会错误返回3,前面的长度5没有被保存下来 - 递归步进逻辑错误:当两个字符相等时直接跳过y进入xs的递归,实际应该保留y作为下一次比较的第一个元素,因为下一个字符还要和y比对是否连续,比如
"111"按原有逻辑仅能得到2,和预期结果3不符
修复后可运行代码
通过带状态的辅助函数实现,记录当前连续长度、历史最大值两个状态:
longestChain :: String -> Int -- 空字符串边界处理 longestChain [] = 0 -- 非空字符串调用辅助函数,初始当前连续长度为1,初始最大值为1 longestChain s = helper s 1 1 where -- 递归到最后一个字符,返回当前最大值 helper [_] current maxVal = max current maxVal helper (x:y:xs) current maxVal -- 当前两个字符相等,当前连续长度+1,同步更新最大值 | x == y = helper (y:xs) (current + 1) (max (current + 1) maxVal) -- 字符不相等,当前连续长度重置为1,最大值保持不变 | otherwise = helper (y:xs) 1 maxVal
测试用例验证
全部测试用例均可正常通过:
longestChain "2111234"返回3longestChain "0023212212222"返回4longestChain "23232323232"返回1longestChain "+++++!!!-------"返回7
内容的提问来源于stack exchange,提问作者topi12
相关产品推荐
相关产品推荐

