我正在尝试返回列表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
我该如何解决这个问题?
答案 0 :(得分: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".