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

OCaml fold_left实现奇偶索引元素分组未通过测试求助

问题分析与修正

你的代码存在两个关键问题,导致无法通过测试:

1. 语法错误

第三个分支的写法完全错误:你写了else List.length acc mod 2 = 0 then,既不符合OCaml的语法规则,又重复了第二个分支的判断条件,导致该分支永远不会被触发,同时代码会直接编译失败。

2. 效率隐患(可能触发隐藏测试超时)

你依赖List.length acc判断元素索引的奇偶性,而List.length是O(n)操作——每次调用都会遍历整个累加器列表。如果隐藏测试包含长列表,这种写法会因为效率过低超时。

修正后的代码

修正语法并保证逻辑正确的版本如下:

let f acc v =
  match acc with
  | [] -> [v]
  | _ ->
    let len = List.length acc in
    if len mod 2 = 0 then
      v :: acc
    else
      acc @ [v]

如果想要更高效的实现,可以用元组作为累加器,避免反复计算列表长度:

let f (left, right, is_even_idx) v =
  match left, right with
  | [], [] -> ([v], [], false)  (* 处理第一个元素a0,标记下一个元素是奇数索引 *)
  | _ ->
    if is_even_idx then
      (v :: left, right, false)  (* 偶数索引元素(>0)放到a0左侧 *)
    else
      (left, right @ [v], true)  (* 奇数索引元素放到a0右侧 *)

(* 最后调用fold_left后,需要合并结果:left @ right *)

验证测试用例

  • 输入[a0] → 输出[a0](符合要求)
  • 输入[a0,a1,a2] → 输出[a2,a0,a1](偶数索引元素在左,奇数在右,a0居中)
  • 输入[a0,a1,a2,a3,a4] → 输出[a4,a2,a0,a1,a3](完全匹配题目给出的格式)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:17:49