Раздать по две карты с равной суммой - 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))))
Объяснение кода листинга программы
В данном коде:
- Создаётся функция
cards
с одним аргументомx
. - Внутри функции создаётся пустая таблица хеш-функций с помощью
make-hash-table
. - Вычисляется значение переменной
m
как произведение двух чисел: двойки и результата вычисления выражения(apply '+ x) / (length x)
. - Создаются метки для внутреннего блока
labels
, который будет выполнять основную работу. - Внутри блока
labels
определяется вспомогательная функцияrazbor
. - Вспомогательная функция
razbor
принимает три аргумента:x
,y
иi
. - Если
x
равноnil
, тоy
возвращается без изменений. - Если ключ
car x
присутствует в таблице хеш-функций, то к значению этого ключа добавляется новая запись(cons (list (gethash (car x) tab) i) y)
. - Если ключ
car x
отсутствует в таблице хеш-функций, то к значению ключа(- m (car x))
добавляется новая запись(cons (list (gethash (- m (car x)) tab) i) y)
. - Если
x
не являетсяnil
, то выполняется рекурсивный вызов вспомогательной функцииrazbor
с аргументами(cdr x)
и(1+ i)
. - В основной функции
cards
вызывается вспомогательная функцияrazbor
с аргументамиx
,nil
и1
. В результате выполнения кода будет выведено сообщение об ошибке, так как условие(null x)
не выполняется.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д