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

Haskell递归函数问题:统计列表中大于/小于指定数的元素数量

问题分析与修正

你的代码核心错误是辅助函数的累加器初始值传错了:

你定义的greaterThanN和lesserThanN第一个参数是统计用的累加器,初始值应该是0(还没开始统计任何元素),但你在主函数里调用时,传给这两个函数的第一个参数是n(比如示例中的3),导致统计从n开始累加,最终结果自然偏大。

以示例lowerAndGreater 3 [1..9]为例:

  • greaterThanN 3 [1..9]:初始累加器是3,统计到6个大于3的元素,3+6=9,所以返回9
  • lesserThanN 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:02:17