2014-01-22 8 views
3

Как получить длину самого длинного подсписок в списке? Я потратил много времени на это, и я понятия не имел.Длина списка в OCaml

Например:

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

возвращается 3

+0

',' используется в кортежах, а не в списках. Используйте группу с запятой, чтобы отделить отдельных лиц от списка. – nlucaroni

+0

Спасибо. Это моя типичная ошибка в окамле. –

ответ

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

Можете ли вы попробовать сделать это с помощью элементарных операций? Я имею в виду без использования List.fold_left и List.length? –

+0

Вам нужно определить, что подразумевает «элементарные операции». Если вы не можете использовать модуль List, это вызывает вопрос, поскольку вы используете списки. – 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

Смежные вопросы