列表的最后一个元素的值

时间:2009-07-23 23:31:44

标签: list f# reverse tail

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

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

11 个答案:

答案 0 :(得分:25)

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

let rec last = function
    | hd :: [] -> hd
    | hd :: tl -> last tl
    | _ -> failwith "Empty list."

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

答案 1 :(得分:22)

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

答案 2 :(得分:11)

快速&这样做的脏方法是使用List.reduce。假设列表名为ls

let lastElement ls = List.reduce (fun _ i -> i) ls

至于效率,我同意帕维尔的意见。

答案 3 :(得分:4)

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

let lastItem = myList |> List.rev |> List.head

myList列表发送到List.rev功能。然后由List.head

处理结果

答案 4 :(得分:3)

同意,获得list的最后一个元素或任何其他“可枚举”序列的效率不高。也就是说,此功能已存在于Seq模块Seq.last

答案 5 :(得分:1)

作为新手F#开发者,我不知道做以下事情会带来什么危害

let mylist = [1;2;3;4;5]

let lastValue = mylist.[mylist.Length - 1]

本质上势在必行?是的,但不需要递归。

答案 6 :(得分:0)

使用F#中的列表的常规方法是使用递归。列表中的第一项是头(显然),列表的其余部分是尾部(与最后一项相反)。因此,当一个函数收到一个列表时,它会处理 head ,然后递归处理列表的其余部分( tail )。

let reversedList = List.rev originalList
let tailItem = List.hd reversedList

答案 7 :(得分:0)

我想你可以写

list.[0..list.Length-1]

答案 8 :(得分:0)

您可以调用List.Head来获取列表的第一个元素,以便下面的表达式求值为true:

let lst = [1;2;3;4;5]
List.head lst = 1

但是,调用List.Tail将返回第一个元素后列表中的每个元素,以使下面的表达式为真:

let lst = [1;2;3;4;5]
List.tail lst = [2;3;4;5]

与其他人提到的一样,F#中没有一种有效的方法可以获得列表的尾部,基本列表并没有考虑到这些功能。如果你真的想要获得最后一个元素,你将不得不首先反转你的列表,然后采取新的头(这是前一个尾部)。

let lst = [1;2;3;4;5]
(List.head (List.rev lst) ) = 5

答案 9 :(得分:0)

下面的代码和我一起工作正常,我有一个整数数组,想从第5项开始,然后把它减去项目编号

Sum of [Array(xi) - Array(xi-5)] where i start at 5

使用的代码是:

series |> Array.windowed 5
       |> Array.fold (fun s x -> 
                            (x |> Array.rev |> Array.head) -  (x |> Array.head) + s) 0
       |> float

答案 10 :(得分:0)

这是一个非常古老的问题,但以防万一有人来到这里:

使用 FSharp 5,您可以执行 x.[^index],其中索引将从数组/列表的末尾开始。

let a = [1;2;3;4;5;6;7;8;9]

a.[^0] is 9
a.[^1] is 8
etc