Haskell递归函数问题:统计列表中大于/小于指定数的元素数量
问题分析与修正
你的代码核心错误是辅助函数的累加器初始值传错了:
你定义的greaterThanN和lesserThanN第一个参数是统计用的累加器,初始值应该是0(还没开始统计任何元素),但你在主函数里调用时,传给这两个函数的第一个参数是n(比如示例中的3),导致统计从n开始累加,最终结果自然偏大。
以示例lowerAndGreater 3 [1..9]为例:
greaterThanN 3 [1..9]:初始累加器是3,统计到6个大于3的元素,3+6=9,所以返回9lesserThanN 3 [1..9]:初始累加器是3,统计到2个小于3的元素,3+2=5,所以返回5
这就是你得到错误结果的原因。
修正后的代码
把主函数中辅助函数的调用改为传0作为初始累加器,同时建议用模式匹配替代null/head/tail,更符合Haskell风格:
lowerAndGreater :: Int -> [Int] -> String lowerAndGreater n list = show n ++ " is greater than " ++ show (lesserThanN 0 list) ++ " elements and lower than " ++ show (greaterThanN 0 list) ++ " elements" where greaterThanN :: Int -> [Int] -> Int greaterThanN count [] = count greaterThanN count (x:xs) | x > n = greaterThanN (count + 1) xs | otherwise = greaterThanN count xs lesserThanN :: Int -> [Int] -> Int lesserThanN count [] = count lesserThanN count (x:xs) | x < n = lesserThanN (count + 1) xs | otherwise = lesserThanN count xs
测试修正后的代码:
lowerAndGreater 3 [1 .. 9] -- 输出:"3 is greater than 2 elements and lower than 6 elements"
内容的提问来源于stack exchange,提问作者Alexander Makarov
相关产品推荐
相关产品推荐

