列表的最后一个元素的值

pis*_*hio 18 f# reverse list tail

如何获取List的最后一个元素的值?我注意到List.hd(或.Head)返回一个项目,而List.tl(或.Tail)返回一个List.

转发列表并获得高清唯一的方法吗?谢谢.

Nol*_*rin 26

试试这个功能.它使用递归,但无论如何都会优化迭代,因为它是尾递归.无论如何,它很可能比倒转整个列表(使用List.rev)更快.

let rec last = function
    | hd :: [] -> hd
    | hd :: tl -> last tl
    | _ -> failwith "Empty list."
Run Code Online (Sandbox Code Playgroud)

然而,Pavel Minaev的答案绝对值得考虑.尽管如此,您所请求的算法在某些极少数情况下可能很有用,并且是执行该任务的最有效方法.

  • 由于这是一个尾递归算法,编译器会将其实现为一个有效的while循环.我倾向于同意Pavel关于数据结构的选择,但如果你需要使用列表,那么这是正确的方法. (2认同)

Pav*_*aev 23

一般来说,如果你需要这样做,你就会做错事.由于F#列表是单链接的,因此访问最后一个元素的代价很高 - O(N)其中N的大小为list.尝试重写算法,以便始终访问第一个元素,而不是最后一个元素(即O(1)).如果你不能这样做,那么首先你选择list数据结构的可能性是不错的.


Joh*_*lds 11

快速而肮脏的方法是使用List.reduce.假设列表被调用ls,

let lastElement ls = List.reduce (fun _ i -> i) ls
Run Code Online (Sandbox Code Playgroud)

至于效率,我同意帕维尔的观点.


Pio*_*ski 5

基于Mitch答案的更简洁的版本:

let lastItem = myList |> List.rev |> List.head
Run Code Online (Sandbox Code Playgroud)

myList列表发送到List.rev功能。然后处理结果List.head