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

使用仅含@和match with的递归函数实现OCaml列表扁平化遇栈溢出如何解决?

OCaml列表扁平化递归函数实现与问题解决

需求背景

需要编写一个递归函数实现列表扁平化,约束条件:

  • 不能使用辅助函数
  • 仅允许使用@运算符
  • 必须采用match with语法

错误代码与问题分析

最初尝试的代码如下:

let rec flatten lst1 = match lst1 with 
  | [] -> []
  | hd::tl -> hd @ (flatten lst1);;

flatten [[3; 4]; [4; 5]];;

这段代码会触发栈溢出,核心原因是递归调用时传入的参数是原列表lst1,而非剩余未处理的tl。这会导致函数无限递归:每次进入hd::tl分支后,又重新处理整个原列表,永远无法触达基准情况[],最终耗尽栈空间。

修正后的正确代码

将递归调用的参数改为tl,即可解决问题:

let rec flatten lst1 = match lst1 with 
  | [] -> []
  | hd::tl -> hd @ (flatten tl);;

flatten [[3; 4]; [4; 5]];;

修正后,每次递归处理的是列表的剩余部分tl,问题规模逐步缩小,最终会遇到空列表的基准情况,递归正常终止。运行上述测试代码,会得到正确结果[3; 4; 4; 5]。

内容的提问来源于stack exchange,提问作者J.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:09