我是OCaml的新手,我现在正在尝试实现一个函数,该函数返回一个列表,其中包含输入列表中偶数位置的所有元素。对于[1; 2; 3; 5] 返回[2; 5]并返回[1 3]返回[3];并且对于[“i”;“am”;“new”;“to”;“ocaml”]返回[“am”;“to”]。希望有人能给我一些解决这个问题的建议。
答案 0 :(得分:5)
在这个问题上没有特别类似于OCaml的东西。最有可能的主要任务是学会递归地解决问题。
递归地解决问题的方法是将其分解为两种情况:
一个。输入很小,答案非常明显。
湾答案不是那么小,但你已经有一个适用于(严格)较小输入的功能。
要解决此问题,您需要决定如何确定输入大小是否非常小(一个非常短的列表),以及如何使用另一个适用于较小列表的函数来解决较大列表的问题。那么你自己的函数就是其他函数(递归调用时)。
答案 1 :(得分:1)
好吧,你想要通过你的列表逐个获取元素,并忘记第一个元素。
let rec get_even = function
| _ :: y :: tl -> y :: (get_even tl)
然后,您需要确保当您到达列表末尾时会发生什么。但是有两种方法可以实现,具体取决于List.length l
的平价。
所以,你的最终代码如下:
let rec get_even = function
| x :: y :: tl -> y :: (get_even tl)
| [] | _::[] -> []
请注意,此函数不是尾递归的,这意味着它会将重量放在堆栈上。与小于堆栈的列表相比,这不是问题,但如果您要处理大数据,则可能会出现问题。在这种情况下,您可能希望使用更适合您问题的数据结构。
答案 2 :(得分:0)
这是一个解决方案:
let rec even_elements l index acc_l = match l with h::t -> if (index mod 2 == 0 ) then even_elements t (index+1) (acc_l@[h]) else even_elements t (index+1) acc_l | [] -> acc_l;;
你会这样称呼:
even_elements [1;2;3;4;5;6] 1 []
我正在迭代列表:
match l with h::t
检查我是否处于偶数索引:
if (index mod 2 == 0 )
如果我是,我会将它附加到累加器:
even_elements t (index+1) (acc_l@[h])
如果我不是,我不会:
even_elements t (index+1) acc_l
另请注意,对于我传入的第一个参数,不是l。这是列表的尾部。
在列表的末尾,我返回应该包含所有偶数元素的累加器:
| [] -> acc_l