2014-01-22 65 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