Количество различных элементов списка - Lisp
Формулировка задачи:
Здравствуйте.
Нужно решить следующую задачу:
Напишите функцию (f L), которая считает количество различных элементов списка L
что уже есть:
Суть проблемы в том, что я не знаю как нормально написать функцию поиска повторяющихся элементов.
Заранее спасибо.
;;считаем количество элементов в списке, с заходом в подсписки
(defun count (s)
(cond ((null s) 0)
((listp (car s))(+ (count (car s)) (count (cdr s))))
(t (1+ (count (cdr s))))
)
)
;;ищем повторения
(defun rep (x s)
(cond ((null s) 0)
((listp (car s)) (+ (rep x (car s)) (rep x (cdr s))))
((eql x (car s)) (1+ (rep x (cdr s))))
(t (rep x (cdr s)))
)
)Решение задачи: «Количество различных элементов списка»
textual
Листинг программы
(defun task (lst) (length (setof (flatten lst)))) ==> task (task '(1 2 3 (((4) (1 2 3))))) ==> 4
Объяснение кода листинга программы
В коде определена функция task, которая принимает один аргумент lst. Внутри функции происходит следующее:
- Вычисляется длина списка
lstс помощью функцииlength. - Получается множество элементов списка
lstс помощью функцииsetof. - Функция
flattenприменяется к спискуlst, чтобы получить одномерный список. - Результат вычисления функции
lengthи результат применения функцииflattenсохраняются в переменнойresult. - Результат вычисления функции
task(который является числом) возвращается из функции. Когда функцияtaskвызывается с аргументом'(1 2 3 (((4) (1 2 3)))))', она возвращает число4, потому что в этом списке есть четыре различных элемента.