List 输出列表中的前n个元素

List 输出列表中的前n个元素,list,recursion,f#,List,Recursion,F#,如何编写一个f#递归函数,该函数接受一个正整数n和一个列表xs作为输入,并返回一个只包含xs中前n个元素的列表 让我们记录一些东西= .. 3[1..10]=[1;2;3]简单的回答是:不要,只使用Seq.take 简单的版本如下: let rec take n list = match n with | 0 -> [] | _ -> List.head list :: take (n - 1) (List.tail list) 尾部递归可能如下所示: let rec

如何编写一个f#递归函数,该函数接受一个正整数n和一个列表xs作为输入,并返回一个只包含xs中前n个元素的列表

让我们记录一些东西= ..
3[1..10]=[1;2;3]

简单的回答是:不要,只使用
Seq.take

简单的版本如下:

let rec take n list = 
  match n with
  | 0 -> []
  | _ -> List.head list :: take (n - 1) (List.tail list)
尾部递归可能如下所示:

let rec take n list =
  let rec innertake m innerlist acc = 
    match m with
    | 0 -> List.rev acc
    | _ -> innertake (m - 1) (List.tail innerlist) ((List.head innerlist) :: acc)
  innertake n list []

请注意,这两种方法都不能处理输入列表比请求的项数短的情况。

最后3个元素如何?简单的方法是反转列表,在新列表上运行
获取
,然后反转结果。更好/更有效的方法超出了此问题的范围,应在单独的问题中回答。