OCaml - 返回一个列表,其中包含输入列表中偶数位置的所有元素

时间:2015-02-01 23:18:43

标签: functional-programming ocaml

我是OCaml的新手,我现在正在尝试实现一个函数,该函数返回一个列表,其中包含输入列表中偶数位置的所有元素。对于[1; 2; 3; 5] 返回[2; 5]并返回[1 3]返回[3];并且对于[“i”;“am”;“new”;“to”;“ocaml”]返回[“am”;“to”]。希望有人能给我一些解决这个问题的建议。

3 个答案:

答案 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
相关问题