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

OCaml中如何不使用递归实现列表转置函数

解决方案

你当前的实现仅提取了所有子列表的第一个元素拼接为新列表,因此只能得到转置结果的第一行,没有覆盖所有列的元素。

要实现无显式递归的完整转置,可以借助OCaml标准库的高阶函数完成,核心思路是先获取原列表的总列数(即第一个子列表的长度,默认输入为合法矩形列表),再按列索引遍历,收集每一列的所有元素组成转置后的对应行。

完整实现代码

let transpLstLst (lst: 'a list list) : 'a list list = 
  match lst with
  | [] -> []
  | first_row::_ -> 
      (* 按列索引生成转置后的每一行 *)
      List.init (List.length first_row) (fun col_idx ->
        List.map (fun row -> List.nth row col_idx) lst
      )

验证测试

用你给出的测试用例调用即可得到预期结果:

let lst = [[1;2;3];[4;5;6];[7;8;9]]
let res = transpLstLst lst
(* res 结果为 [[1;4;7];[2;5;8];[3;6;9]],符合预期 *)

注意说明

  • 该实现没有使用自定义递归,完全基于标准库高阶函数实现,符合要求
  • 默认输入为所有子列表长度相同的矩形列表,若需兼容长度不一致的非矩形输入,可额外增加子列表长度校验逻辑,避免List.nth访问越界报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:24:03