列表的最后一个元素的值(Value of the last element of a list)

2019-06-26 15:51发布

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

是修订版的目录和各地获得高清的唯一途径? 谢谢。

Answer 1:

试试这个功能。 它使用递归,尽管它得到优化,因为它的尾递归反正迭代。 在任何情况下,它比逆转(使用整个列表最有可能更快List.rev )。

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

帕维尔Minaev的答案是绝对值得考虑,但是。 然而,你所要求的算法可以在某些罕见的情况下是有用的,是最有效的方法去的任务。



Answer 2:

一般来说,如果你需要做这个,你做了什么。 由于F#列表是单连接的,访问的最后一个元素是昂贵- O(N)其中N是大小list 。 尝试重写你的算法,让你始终可以访问第一个元素,而不是最后的(这是O(1) 如果你不能做到这一点,有很好的机会,你的选择list的数据结构是不是摆在首位正确的。



Answer 3:

这样做的一个快速和肮脏的方法是使用List.reduce。 假设列表被称为ls

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

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



Answer 4:

基于米奇的回答更加简洁的版本:

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

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



Answer 5:

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



Answer 6:

作为一个新手F#开发人员,我看不到的危害是在做什么如下

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

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

势在必行性质? 是的,但没有必要递归。



Answer 7:

在F#列表的工作常规方法是使用递归。 在列表中的第一项是头(显然)和列表的其余部分是尾巴(如反对到最后一个项目)。 因此,当一个功能临危列表它处理的 ,然后递归处理列表( 尾部 )的其余部分。

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


Answer 8:

我想你可以只写

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


Answer 9:

您可以拨打List.Head获取列表的第一个元素,使得下面的表达式的值为true:

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

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

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


Answer 10:

下面的代码与我工作得很好,我有一个整数数组,想从第五项开始,然后把它减的项目数量

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


文章来源: Value of the last element of a list