#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 является использование рекурсии. Попробуйте некоторые шаблоны рекурсии и (если вам все еще нужна помощь), обновите свой вопрос, чтобы показать, что вы пробовали.