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
相关产品推荐
相关产品推荐

