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

SML含ref的递归函数报错求助:统计元组中指定月份出现次数

问题排查与修复:统计列表中指定月份的元组数量

你的代码核心存在几个关键问题,导致无法正确统计目标元组的数量:

  • 用ref维护计数的思路完全错误:递归调用的每个层级都会创建新的dates引用,不同层级的引用相互独立,根本做不到累加计数。而且在else分支里,你先执行add_1修改当前层级的dates,随后直接调用递归,但最终返回的是递归调用的结果,当前层级的修改完全被丢弃,等于白做。
  • 嵌套结构过于冗余:没必要单独绑定tl_ans、hd_ans,也不需要额外封装add_1函数。

纯函数式的正确实现(无需ref)

SML是函数式语言,递归应该用纯函数方式实现:每次递归处理剩余列表,把当前元素的判断结果(符合条件加1,否则加0)和递归结果相加即可。

fun number_in_month (lst: (int*int*int) list, month: int) =
    if null lst then
        0
    else
        let
            val current_count = if #2 (hd lst) = month then 1 else 0
        in
            current_count + number_in_month(tl lst, month)
        end

原代码错误细节拆解

  1. ref作用范围失效:每个递归调用都会进入新的let绑定,创建全新的dates引用,之前层级修改的dates和当前层级毫无关联,累加逻辑完全不成立。
  2. 表达式返回值逻辑错误:SML中顺序执行的多个表达式,最终返回的是最后一个表达式的结果。你原代码else分支里,add_1(hd_ans)的执行结果被直接忽略,最终返回的是递归调用的结果,当前层级的计数修改根本没被用到。
  3. 冗余的代码结构:add_1函数完全是多余的,直接在当前分支判断元组的第二个元素即可,不需要额外封装。

测试示例

调用number_in_month([(2024, 3, 15), (2024, 3, 20), (2024, 4, 5)], 3),会返回2,符合预期。

内容的提问来源于stack exchange,提问作者hayam Mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:47:48