Раздать по две карты с равной суммой - Lisp

Узнай цену своей работы

Формулировка задачи:

Задача из раздела "Форум C# для начинающих": Решение задачи по раздаче карт с числами

Решение задачи: «Раздать по две карты с равной суммой»

textual
Листинг программы
(defun cards (x)
 (let
  ((tab (make-hash-table))
   (m (* 2 (/ (apply '+ x) (length x)))))
  (labels
   ((razbor (x y i)
     (cond
      ((null x) y)
      ((gethash (car x) tab)
       (setq y (cons (list (gethash (car x) tab) i) y))
       (remhash (car x) tab)
       (razbor (cdr x) y (1+ i)))
      (t
       (setf (gethash (- m (car x)) tab) i)
       (razbor (cdr x) y (1+ i))))))
   (razbor x nil 1))))

Объяснение кода листинга программы

В данном коде:

  1. Создаётся функция cards с одним аргументом x.
  2. Внутри функции создаётся пустая таблица хеш-функций с помощью make-hash-table.
  3. Вычисляется значение переменной m как произведение двух чисел: двойки и результата вычисления выражения (apply '+ x) / (length x).
  4. Создаются метки для внутреннего блока labels, который будет выполнять основную работу.
  5. Внутри блока labels определяется вспомогательная функция razbor.
  6. Вспомогательная функция razbor принимает три аргумента: x, y и i.
  7. Если x равно nil, то y возвращается без изменений.
  8. Если ключ car x присутствует в таблице хеш-функций, то к значению этого ключа добавляется новая запись (cons (list (gethash (car x) tab) i) y).
  9. Если ключ car x отсутствует в таблице хеш-функций, то к значению ключа (- m (car x)) добавляется новая запись (cons (list (gethash (- m (car x)) tab) i) y).
  10. Если x не является nil, то выполняется рекурсивный вызов вспомогательной функции razbor с аргументами (cdr x) и (1+ i).
  11. В основной функции cards вызывается вспомогательная функция razbor с аргументами x, nil и 1. В результате выполнения кода будет выведено сообщение об ошибке, так как условие (null x) не выполняется.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы