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

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

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

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

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

textual
Листинг программы
  1. (defun cards (x)
  2.  (let
  3.   ((tab (make-hash-table))
  4.    (m (* 2 (/ (apply '+ x) (length x)))))
  5.   (labels
  6.    ((razbor (x y i)
  7.      (cond
  8.       ((null x) y)
  9.       ((gethash (car x) tab)
  10.        (setq y (cons (list (gethash (car x) tab) i) y))
  11.        (remhash (car x) tab)
  12.        (razbor (cdr x) y (1+ i)))
  13.       (t
  14.        (setf (gethash (- m (car x)) tab) i)
  15.        (razbor (cdr x) y (1+ i))))))
  16.    (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы