Рекурсивная функция для обсуждения в Окамле - PullRequest
2 голосов
/ 29 июля 2011

Я определил тип и функцию:

type element = ...

let merge (x0: element) (x1: element): element * bool = ...

Вторая часть возврата merge представляет собой, если x0 и x1 являются объединяемыми. Если это так, первая часть возврата является результатом слияния, в противном случае первая часть может быть проигнорирована.

Затем я хотел бы реализовать функцию restructure: element list -> element list, которая продолжает слияние до тех пор, пока любые 2 элемента списка могут объединяться (мы заменяем 2 элемента результатом их объединения couse), порядок объединения не важно.

Полагаю, это должна быть рекурсивная функция, и немного сложная для меня на данном этапе, кто-нибудь может помочь?

Большое спасибо

1 Ответ

2 голосов
/ 30 июля 2011

Хорошо, я мог бы опубликовать решение, но это не весело и не очень поучительно для вас :). Вместо этого позвольте мне дать несколько советов, и если вы все еще застряли, я постараюсь помочь больше.

  • Действительно, как предположил Натан, похоже, что ваша merge функция должна возвращать option(element), что является классическим способом возврата необязательных результатов функций.
  • Чтобы написать restructure, я предлагаю вам начать с функции merge_into(res : element, elts : element list), которая попытается объединить elts в res. Надеемся, что это будет проще, чем restructure.
  • Как реализовать restructure, используя merge_into?

Не стесняйтесь, дайте мне знать, если у вас все еще есть проблемы ... счастливого кодирования! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...