Количество различных элементов списка - 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
, потому что в этом списке есть четыре различных элемента.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д