2011-07-18 108 views

回答

11

鑑於此操作是線性的,您不應將其用於性能至關重要的代碼「熱」部分。在寒冷部分,按照Adi的建議使用list @ [element]。在熱門的部分,重寫你的算法,這樣你就不需要那樣做。

執行此操作的典型方法是在處理過程中在反向訂單中累積結果,然後在返回結果之前顛倒整個累計列表。如果你有N個處理步驟(每個步驟都添加一個元素到列表中),那麼你就分攤N個元素的反向線性代價,所以你保留一個線性算法而不是二次方法。

在某些情況下,另一種工作是處理反向順序中的元素,以便累計結果變爲正確順序,而無需顯式反轉步驟。

18

的原因有沒有一個標準功能,要做到這一點的是,在列表的末尾附加是反模式(又名一個「snoc列表」或Schlemiel the Painter algorithm)。在列表末尾添加元素需要列表的完整副本。在列表前面添加一個元素需要分配一個單元格—新列表的尾部可以指向舊列表。

這就是說,最簡單的方法來做到這一點是

let append_item lst a = lst @ [a] 
相關問題