2015-03-24 41 views
4

我知道當使用ocaml模式匹配時,可以使用h::t 當使用此參數時,h引用列表中的第一個元素,t將引用列表的其餘部分。是否有可能使用相同類型的匹配來獲取列表中的最後一個元素。所以t將引用最後一個元素,h將引用列表的其餘部分。如何訪問ocaml中的列表中的最後一個元素

的代碼的例子,對於是

let rec remove x y = match y with 
    [] -> x 
| h::t -> remove (remove_element x (get_last y)) h 
;; 

回答

3

不,這將是有益的,沒有模式,對一個列表的末尾匹配。這在OCaml中不是一個有吸引力的結構,因爲它需要線性時間才能找到列表的末尾。 OCaml模式匹配應該很快。

您可以反轉您的列表並匹配反轉列表的開頭。這只是一個常數因子,比找到列表的末尾要慢。

+0

完美的工作我甚至已經創建了一個反向函數。謝謝 – 2015-03-24 23:36:20

+3

標準庫中已經存在一個反向函數:'List.rev' – 2015-03-26 00:58:07

4

如果你想獲得最後一個元素,那麼你可以直到你遇到這種情況遞歸遍歷列表:| [x] -> x

-1

我能找到一個列表的最後一個元素相匹配的2個模式,已經提到的aycc。這是快速測試:

# let matchtest = function 
    | []   -> "empty list" 
    | [x]  -> "single element list with "^x 
    | x :: [] -> "last element: "^x 
    | x :: tail -> "at least 2 elements" 
    ;; 
Warning 11: this match case is unused. 
val matchtest : string list -> string = <fun> 

警告是行返回「最後一個元素...」,使明顯,[x]x :: []是相同的。

所以當遞歸遍歷列表時,您可以識別最後一個元素。但是你不能在一種模式中擁有第一個和最後一個元素。

一種替代方法是將列表轉換爲數組Array.of_list,您可以在索引(Array.length yourarray) - 1處找到最後一個元素。

相關問題