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

时的修订版列表和各地获得高清的唯一途径?感谢。

有帮助吗?

解决方案

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

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

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

其他提示

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

做这件事的一个快速和肮脏的方式是通过使用List.reduce。假设列表被称为ls

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

至于效率,我同意的Pavel。

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

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

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

商定,不那么有效地得到list的最后一个元素,或任何其他“枚举”序列。这就是说,该函数已经存在的Seq模块中,Seq.last

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

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

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

祈使在自然界中?是的,但没有必要递归。

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

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

我觉得你可以只写

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

可以调用List.Head获取列表的第一个元素,从而使得下面的表达式求值为真:

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

下面的代码工作正常在我身边,我有一个整数数组,想从第五项开始,然后把它减项数

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top