OCaml的。返回列表的前n个元素

时间:2014-10-24 07:54:25

标签: list functional-programming nested ocaml elements

我是OCaml和功能编程的新手。我正在进行一项任务的一部分,我必须简单地返回列表的前n个元素。我不允许使用List.Length。

我觉得我所写的内容对于我想要完成的事情来说可能过于复杂。我的代码尝试做的是将列表的前面连接到结尾,直到n递减到1.此时,头部将n-1个点移动到列表的尾部,然后返回尾部。再一次,我意识到可能有一种更简单的方法可以做到这一点,但我很难过并且可能表明我无法掌握函数式编程。

   let rec take n l =
        let stopNum = 0 - (n - 1) in
        let rec subList n lst =
        match lst with
        | hd::tl -> if n = stopNum then (tl)
                        else if (0 - n) = 0 then (subList (n - 1 ) tl )
                        else subList (n - 1) (tl @ [hd])
        | [] -> [] ;;

我的编译器告诉我最后一行有语法错误。无论“| [] - > []”是最后一行还是上一行,我都得到相同的结果。当我取出嵌套的subList let时,语法错误不存在。很明显,我只是不理解嵌套的东西。

感谢。

3 个答案:

答案 0 :(得分:1)

由于您刚开始使用FP,我建议您寻找最简单,最优雅的解决方案。您正在寻找的是通过从针对较小问题的解决方案构建n来解决n问题的方法。

所以关键问题是:如果你已经有一个可以生成列表的第一个(n - 1)元素的函数,你怎么能产生列表的前n个元素?

然后你需要解决“基础”案例,案件很简单,答案很明显。对于这个问题,我会说有两种基本情况:当n为0时,答案是显而易见的;当列表为空时,答案显而易见。

如果你通过这个工作,你会得到一个相当优雅的定义。

答案 1 :(得分:1)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main-class">
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
  <div class="myclass">colors</div>
</div>

您可能一直在寻找这个。

答案 2 :(得分:0)

这里要做的是迭代初始列表l,然后在累加器中添加此列表的元素,直到n为0.

let take n l =
  let rec sub_list n accu l =
    match l with 
    | [] -> accu (* here the list is now empty, return the partial result *)
    | hd :: tl ->
      if n = 0 then accu (* if you reach your limit, return your result *)
      else (* make the call to the recursive sub_list function:
                 - decrement n, 
                 - add hd to the accumulator,
                 - call with the rest of the list (tl)*) 
  in
  sub_list n [] l