Сравнить два списка в Ocaml

#functional-programming #ocaml

#функциональное программирование #ocaml

Вопрос:

Кажется достаточно простым, но я новичок в этом языке и у меня возникли некоторые проблемы. Учитывая два списка, каким был бы наилучший способ написать функцию, чтобы определить, какой список «больше».

Например: [1:2:3] и [1:3:2] вернут [1:3:2]

Эти списки не обязательно должны быть одинаковой длины: [1: 2] и [1:2:3] вернут [1:2:3]

Спасибо.

Комментарии:

1. Не так много, несколько потеряно с того, как начать. Прошел через это: caml.inria.fr/pub/docs/manual-ocaml/libref/List.html

2. Хорошо, тогда я дам вам подсказку. Какой из них должен быть больше, [1; 3] или [1; 2; 3] ? Если последнее, то вам нужно сначала сравнить длины списков, затем сравнить их по элементам. Также: можно начать с неправильной реализации. На самом деле, вы можете опубликовать это здесь, чтобы люди могли помочь в его отладке.

3. Хорошо, еще один совет: есть встроенные функции для выполнения обеих частей, о которых я упоминал выше, в документации, на которую вы ссылались. Что касается первой части, вы, вероятно, знаете, какую функцию я имею в виду. Вторую часть смотрите в разделе «Сканирование списка».

4. @Yawar, сначала вычислять длину совершенно не нужно и неэффективно.

5. @AndreasRossberg но это поучительно.

Ответ №1:

Предопределенная функция max сделает это за вас:

 # max [1;2;3] [1;3;2];;
- : int list = [1; 3; 2]
# max [1;2] [1;2;3];;
- : int list = [1; 2; 3]
  

Конечно, это зависит от того, что вы подразумеваете под «большим». Встроенные сравнения OCaml используют лексикографический порядок. Если бы вы хотели использовать какой-то другой порядок, вам действительно пришлось бы написать свою собственную функцию.

Или, может быть, вы хотите написать свою собственную функцию с нуля просто для практики. В этом случае хорошим способом работы со списками в OCaml является использование рекурсии. Попробуйте некоторые шаблоны рекурсии и (если вам все еще нужна помощь), обновите свой вопрос, чтобы показать, что вы пробовали.