2014-01-22 64 views
3

如何獲取列表中最長的子列表的長度?我在這上面花了很多時間,而我不知道。OCaml中的列表的長度

例如:

Function([[1;2];[1;2;3];[]]) 

回報3

+0

的','在元組中使用,而不是列表。使用分號分隔列表中的個人。 – nlucaroni

+0

謝謝。那是我在ocaml中的典型錯誤。 –

回答

2

即使使用fold_left工作的其他解決方案,這裏是 「手動編碼」 的解決方案:

let longestsublist l = 
    (let rec aux l current_max = match l with 
           | [] -> current_max 
           | x::xs -> aux xs (max (List.length x) current_max)    
    in aux l (-1)) 
4

我與OCaml的相當生疏,但一List.fold_left應該足夠:

List.fold_left (fun a b -> Pervasives.max a (List.length b)) 0 [[1;2];[1;2;3];[]] 

我現在不能對代碼進行測試並且自從我上次使用OCaml(版本3.XX)以來已經很長時間了,所以語法可能有點不同,但是這種方法絕對有效:您通過摺疊函數來獲取當前最大值和當前子列表作爲輸入,它將返回兩者之間的最大值。

+0

你可以嘗試使用elementar操作嗎?我的意思是不使用List.fold_left和List.length? –

+0

您必須定義「基本操作」的含義。如果你不能使用列表模塊,它會引起問題,因爲你正在使用列表。 – nlucaroni

3

這應該工作

List.fold_left (fun current_max l -> max current_max (List.length l)) 0 [[1;2]; [1;2;3]; []] 

,您可以嘗試在http://try.ocamlpro.com