Возврат медианы 5-го кортежа после использования сортировки

#sorting #ocaml #median

#сортировка #ocaml #медиана

Вопрос:

Я новичок в FP и OCaml. Причина, по которой я пытаюсь сделать это таким грубым способом, заключается в том, что я не изучал списки в OCaml. Я пытаюсь написать функцию, которая возвращает медиану 5-го кортежа после сортировки 5-го кортежа с помощью функции с именем sort5, которую я написал. Это код

 let median5 (a, b, c, d, e) =
let sort5 (a, b, c, d, e) = 
let sort2 (a, b) = if a > b then (b, a) else (a, b) in
let sort3 (a, b, c) = 
let (a, b) = sort2 (a, b) in
let (b, c) = sort2 (b, c) in
let (a, b) = sort2 (a, b) in
(a, b, c) in
let sort4 (a, b, c, d) = 
let (a, b) = sort2 (a, b) in 
let (b, c) = sort2 (b, c) in
let (c, d) = sort2 (c, d) in
let (a, b, c) = sort3 (a, b, c) in
(a, b, c, d) in
let (a, b) = sort2 (a, b) in 
let (b, c) = sort2 (b, c) in
let (c, d) = sort2 (c, d) in
let (d, e) = sort2 (d, e) in
let (a, b, c, d) = sort4 (a, b, c, d) in
(a, b, c, d, e);;
  

Я попытался использовать if, get_med (a, b, c, d, e) = c и кучу других глупых способов, которые, как я думал, сработают, но ничего не получил. Я всегда получаю синтаксическую ошибку, если мне удастся избавиться от этого, то я застрял с неиспользуемой переменной sort5 или get_med . Я уже сожалею о жестокости. Спасибо.

Ответ №1:

Добавьте следующее в конец вашего кода:

 in
let (_, _, m, _, _) = sort5 (a, b, c, d, e) in
m
  

Ваш код будет намного более читаемым, если вы определите каждую функцию отдельно.

 let sort2 (a, b) =
  if a > b then (b, a) else (a, b)

let sort3 (a, b, c) = 
  let (a, b) = sort2 (a, b) in
  let (b, c) = sort2 (b, c) in
  let (a, b) = sort2 (a, b) in
  (a, b, c)

let sort4 (a, b, c, d) = 
  let (a, b) = sort2 (a, b) in 
  let (b, c) = sort2 (b, c) in
  let (c, d) = sort2 (c, d) in
  let (a, b, c) = sort3 (a, b, c) in
  (a, b, c, d)

let sort5 (a, b, c, d, e) =
  let (a, b) = sort2 (a, b) in 
  let (b, c) = sort2 (b, c) in
  let (c, d) = sort2 (c, d) in
  let (d, e) = sort2 (d, e) in
  let (a, b, c, d) = sort4 (a, b, c, d) in
  (a, b, c, d, e)

let median5 (a, b, c, d, e) =
  let (_, _, m, _, _) = sort5 (a, b, c, d, e) in
  m
  

Как вы говорите, этот код совсем не практичен. Я надеюсь, что вы скоро научитесь работать со списками 🙂

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

1. Спасибо. Я вижу, где я допустил ошибку. Я перепробовал так много способов сделать «в …», но не этот.

2. Спасибо. Я определенно сделаю это в следующие недели. Я думал об определении каждой функции отдельно, но я помещаю этот код в HackerRank и не хочу, чтобы это действительно вызывало больше проблем :-). Иногда компиляция может вызывать недовольство.