Построение списка из элементов, встречающихся в списке n раз (XLisp)

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

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

Определите функцию, зависящую от двух аргументов u и n, которая по данному списку строит список его элементов, встречающихся в нем не менее n раз. Нужно реализовать в XLisp.

Решение задачи: «Построение списка из элементов, встречающихся в списке n раз (XLisp)»

textual
Листинг программы
(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 два раза, будет следующим:

  1. a
  2. b Список элементов, встречающихся в списке n три раза, будет следующим:
  3. c
  4. d Список элементов, встречающихся в списке n четыре раза, будет следующим:
  5. a Список элементов, встречающихся в списке n пять раз, будет пустым, так как ни один элемент не встречается в списке n пять раз.

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


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

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

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