我是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时,语法错误不存在。很明显,我只是不理解嵌套的东西。
感谢。
答案 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