Как получить длину самого длинного подсписок в списке? Я потратил много времени на это, и я понятия не имел.Длина списка в OCaml
Например:
Function([[1;2];[1;2;3];[]])
возвращается 3
Как получить длину самого длинного подсписок в списке? Я потратил много времени на это, и я понятия не имел.Длина списка в OCaml
Например:
Function([[1;2];[1;2;3];[]])
возвращается 3
, даже если другие решения с использованием 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))
Я довольно ржавый с 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), поэтому синтаксис может быть немного другим, но подход определенно работает: вы переходите к функции, которая принимает текущий максимум и текущий подписок в качестве ввода, он возвращает максимум между ними.
Можете ли вы попробовать сделать это с помощью элементарных операций? Я имею в виду без использования List.fold_left и List.length? –
Вам нужно определить, что подразумевает «элементарные операции». Если вы не можете использовать модуль List, это вызывает вопрос, поскольку вы используете списки. – nlucaroni
Это должно работать
List.fold_left (fun current_max l -> max current_max (List.length l)) 0 [[1;2]; [1;2;3]; []]
Вы можете попробовать его на http://try.ocamlpro.com
',' используется в кортежах, а не в списках. Используйте группу с запятой, чтобы отделить отдельных лиц от списка. – nlucaroni
Спасибо. Это моя типичная ошибка в окамле. –