将元素添加到列表末尾的最简单方法是什么?

时间:2011-07-18 11:56:03

标签: list ocaml

由于:: : 'a -> 'a list -> 'a list用于向列表的开始添加元素,有人可以告诉我是否有向结尾添加元素的功能列表?如果没有,我猜List.rev (element::(List.rev list))是最简单的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:19)

没有标准功能的原因是在列表末尾添加的是反模式(又名“snoc list”或Schlemiel the Painter algorithm)。在列表末尾添加元素需要列表的完整副本。在列表前面添加元素需要分配一个单元格 - 新列表的尾部可以指向旧列表。

尽管如此,最简单的方法是

let append_item lst a = lst @ [a]

答案 1 :(得分:16)

list@[element]应该有效。 @加入列表。

答案 2 :(得分:12)

鉴于此操作是线性的,您不应在代码的“热门”部分使用它,因为性能很重要。在寒冷的部分,请list @ [element]建议使用Adi。在一个热门的部分,重写您的算法,以便您不需要这样做。

执行此操作的典型方法是在处理期间以 reverse 顺序累积结果,然后在返回结果之前反转整个累积列表。如果你有N个处理步骤(每个都在列表中添加一个元素),那么你可以分摊反向N个元素的线性成本,所以你保留一个线性算法而不是二次算法。

在某些情况下,另一种有效的技术是以反向顺序处理您的元素,这样累积的结果就会以正确的顺序处理,而不会有明确的反转步骤。