如何返回列表副本:将奇数长度的子列表翻倍
OCaml 列表处理:翻倍奇数长度子列表
需求
返回一个列表的副本,其中奇数长度的子列表需被自身拼接一次(即翻倍)。
示例
输入
oddList [[]; [1]; [1;2]; [1;2;3]; []; [5;4;3;2;1]]
预期输出
[[]; [1; 1]; [1; 2]; [1; 2; 3; 1; 2; 3]; []; [5; 4; 3; 2; 1; 5; 4; 3; 2; 1]]
问题排查与修正
你尝试的代码未达预期,问题出在两个细节上:
let rec listes_paires l = match l with | [] -> [] | x :: r -> if length x mod 2 = 0 then (x :: (listes_paires r)) else ((x@x):: (listes_paires r));;
问题点
- 未正确引用List模块的length函数:OCaml中直接使用
length会报错,需明确写成List.length,或者提前open List。 - 函数名与示例调用不匹配:示例中调用的是
oddList,但你的函数名是listes_paires,会导致调用失败。
修正后的代码
以下是两种可行的修正版本:
版本1:打开List模块
open List let rec oddList l = match l with | [] -> [] | x :: r -> if length x mod 2 = 1 then (x @ x) :: oddList r else x :: oddList r
版本2:直接使用List.length
let rec oddList l = match l with | [] -> [] | x :: r -> if List.length x mod 2 = 1 then (x @ x) :: oddList r else x :: oddList r
验证效果
调用修正后的oddList函数,输入示例中的列表,即可得到预期的输出结果。
内容的提问来源于stack exchange,提问作者user21450992
相关产品推荐
相关产品推荐

