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

SML列表反转函数求助:为何我的实现无法正常工作?

你的SML列表反转函数失效的原因分析

先看你写的代码:

fun reverse ( [] ) = ( [] )
  | reverse (x::xs) = reverse (xs) :: [x]

问题出在递归分支的运算符使用错误:

  • SML中的::运算符作用是把单个元素添加到列表的头部,它要求左边必须是单个元素,右边是列表。
  • 但你递归调用reverse(xs)返回的是一个完整的列表(比如反转后的子列表),不是单个元素,用::把它和[x]组合,会导致结果变成嵌套的列表,而不是扁平的反转列表。

举个例子,调用reverse [1,2,3]的过程会生成[[[[],3],2],1],完全不是预期的[3,2,1]。

修正方案

你需要用列表拼接运算符@来替代::,@的作用是把两个列表合并,两边都要求是列表:

fun reverse [] = []
  | reverse (x::xs) = reverse xs @ [x]

如果追求更高的效率(@每次拼接都要遍历左侧列表,时间复杂度O(n²)),可以用带累加器的尾递归版本,时间复杂度是O(n):

fun reverse lst =
    let
        fun rev_helper [] acc = acc
          | rev_helper (x::xs) acc = rev_helper xs (x::acc)
    in
        rev_helper lst []
    end

内容的提问来源于stack exchange,提问作者Aaryuman Sawai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:16:03