返回列表的前k个元素。我的代码返回最后k个元素

时间:2016-10-20 23:01:58

标签: list recursion ocaml tail-recursion

我正在尝试返回列表xs的第一个 k 元素。例如,take 2 [1; 2; 3]应输出[1; 2]

我编写了一个函数,但是它没有返回第一个 k 元素,而是返回最后的 k 元素,而不是返回整个列表,如果 k < / em>等于列表的长度,它失败。

这是我的代码

let rec take k = function
|[] -> failwith "take"
|x :: xs -> if k = List.length xs  then xs else take (List.length xs - k) xs

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

你需要回答递归写作的两个基本问题:

  1. 哪些案件如此微不足道,答案显而易见?
  2. 如果给出一个非常重要的情况,我该如何制作一个较小的实例,这样我就可以通过使用我正在编写 1的相同函数来获得该较小实例的答案 ,然后通过一些简单的步骤从那个较小的答案中找到我的完整答案?
  3. 对于这个问题,琐碎的情况(我会说)是当 k 0 时,以及当给定列表是空列表时。

    对于非平凡的情况,洞察力似乎是我可以获得第一个 k> 0 的第一个 k 元素(k - 1)列表的 tail 元素,然后将原始列表的 head 添加到 2

    这不是你的代码所做的,所以它基本上不起作用的原因: - )

    作为旁注,我不会认为要求任何列表的第一个 0 元素(包括空列表)是错误的。

    1 并且递归方法的本质是假设您已经拥有它。

    2 这是因为身份public void deserializeJsonIntoThis(String json) { this.document_tone = fromJsonString(json).document_tone; }

答案 1 :(得分:0)

只是一种不同的方式:

let take k l =
  let v =Array.of_list l in
  let v'=Array.make k 0 in
  Array.blit v 0 v' 0 k;
  Array.to_list v';;

试验:

# take 2 [1;2;3];;
- : int list = [1; 2]
# take 0 [1;2;3];;
- : int list = []
# take 4 [1;2;3];;
Exception: Invalid_argument "Array.blit".