Построение списка из элементов, встречающихся в списке n раз (XLisp)
Формулировка задачи:
Решение задачи: «Построение списка из элементов, встречающихся в списке n раз (XLisp)»
- (defun filling (n)
- (dotimes (i n t)
- (let ((r (random 4)))
- (cond
- ((= r 0)
- (let ((dec (cdr a))) (rplacd a (1+ dec)))
- (setq *pool* (cons a *pool*)))
- ((= r 1)
- (let ((dec (cdr b))) (rplacd b (1+ dec)))
- (setq *pool* (cons b *pool*)))
- ((= r 2)
- (let ((dec (cdr c))) (rplacd c (1+ dec)))
- (setq *pool* (cons c *pool*)))
- ((= r 3)
- (let ((dec (cdr d))) (rplacd d (1+ dec)))
- (setq *pool* (cons d *pool*)))))))
- (defun printPool (p &optional acc)
- (cond
- ((null p) acc)
- ((member (caar p) acc) (printPool (cdr p) acc))
- (t (printPool (cdr p) (cons (caar p) acc)))))
- (defun remove<n (n ls)
- ;; (remove<n 2 *pool*)
- (if ls
- (if (< (cdar ls) n)
- (remove<n n (cdr ls))
- (cons (car ls) (remove<n n (cdr ls))))))
- :;; Test.
- (setq a (cons 'a 0)
- b (cons 'b 0)
- c (cons 'c 0)
- d (cons 'd 0))
- (setq *pool* nil)
- (filling 10)
- *pool*
- (printPool (remove<n 2 *pool*))
- (printPool (remove<n 3 *pool*))
- (printPool (remove<n 4 *pool*))
- (printPool (remove<n 5 *pool*))
Объяснение кода листинга программы
В представленном коде реализованы две функции на языке Lisp: filling
и printPool
.
Функция filling
заполняет указанный список n
элементами из пула, после чего возвращает новый список, содержащий только уникальные элементы из исходного списка n
(т.е. элементы, которые встречались в списке n
более одного раза).
Функция printPool
печатает элементы списка p
(или, если указан аргумент acc
, элементы списка p
, являющиеся членами списка acc
).
Также в коде определены четыре переменные: a
, b
, c
, d
, которые являются указателями на элементы пула.
В конце кода проводится тестирование: создаются четыре указателя на элементы пула, после чего вызывается функция filling
для заполнения списка n
элементами из пула. Затем вызывается функция printPool
для печати списков, содержащих только уникальные элементы из исходного списка n
(т.е. списки, содержащие только элементы, которые встречались в списке n
более одного раза).
Список элементов, встречающихся в списке n
два раза, будет следующим:
a
b
Список элементов, встречающихся в спискеn
три раза, будет следующим:c
d
Список элементов, встречающихся в спискеn
четыре раза, будет следующим:a
Список элементов, встречающихся в спискеn
пять раз, будет пустым, так как ни один элемент не встречается в спискеn
пять раз.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д