题
如何让一个列表的最后一个元素的价值?我已经注意到,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