【问题标题】:OCaml. Return first n elements of a listOCaml。返回列表的前 n 个元素
【发布时间】:2014-12-20 00:58:40
【问题描述】:

我是 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 时不存在语法错误。显然,我只是不理解关于嵌套让的一些东西。

谢谢。

【问题讨论】:

    标签: list functional-programming nested ocaml elements


    【解决方案1】:

    你需要做的是迭代你的初始列表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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:
        let rec firstk k xs = match xs with
        | [] -> failwith "firstk"
        | x::xs -> if k=1 then [x] else x::firstk (k-1) xs;;
        

        你可能一直在寻找这个。

        【讨论】:

          猜你喜欢
          • 2012-04-05
          • 1970-01-01
          • 2014-12-12
          • 2023-01-10
          • 1970-01-01
          • 2017-03-05
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多