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

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

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

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

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

textual
Листинг программы
  1. (defun filling (n)
  2.   (dotimes (i n t)
  3.     (let ((r (random 4)))
  4.       (cond
  5.         ((= r 0)
  6.          (let ((dec (cdr a))) (rplacd a (1+ dec)))
  7.          (setq *pool* (cons a *pool*)))
  8.         ((= r 1)
  9.          (let ((dec (cdr b))) (rplacd b (1+ dec)))
  10.          (setq *pool* (cons b *pool*)))
  11.         ((= r 2)
  12.          (let ((dec (cdr c))) (rplacd c (1+ dec)))
  13.          (setq *pool* (cons c *pool*)))
  14.         ((= r 3)
  15.          (let ((dec (cdr d))) (rplacd d (1+ dec)))
  16.          (setq *pool* (cons d *pool*)))))))
  17.  
  18. (defun printPool (p &optional acc)
  19.   (cond
  20.     ((null p) acc)
  21.     ((member (caar p) acc) (printPool (cdr p) acc))
  22.     (t (printPool (cdr p) (cons (caar p) acc)))))
  23.  
  24. (defun remove<n (n ls)
  25.   ;; (remove<n 2 *pool*)
  26.   (if ls
  27.       (if (< (cdar ls) n)
  28.           (remove<n n (cdr ls))
  29.           (cons (car ls) (remove<n n (cdr ls))))))
  30.  
  31. :;; Test.
  32. (setq a (cons 'a 0)
  33.       b (cons 'b 0)
  34.       c (cons 'c 0)
  35.       d (cons 'd 0))
  36.  
  37. (setq *pool* nil)
  38.  
  39. (filling 10)
  40.  
  41. *pool*
  42.  
  43. (printPool (remove<n 2 *pool*))
  44. (printPool (remove<n 3 *pool*))
  45. (printPool (remove<n 4 *pool*))
  46. (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

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

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

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