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

