如何获取列表的最后一个元素的价值? 我注意到,List.hd(或。头)返回一个项目,而List.tl(或.Tail)返回一个列表。
是修订版的目录和各地获得高清的唯一途径? 谢谢。
如何获取列表的最后一个元素的价值? 我注意到,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
至于效率,我同意帕维尔。
基于米奇的回答更加简洁的版本:
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获取列表的第一个元素,使得下面的表达式的值为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
下面的代码与我工作得很好,我有一个整数数组,想从第五项开始,然后把它减的项目数量
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