Поиск наиболее встречающегося элемента в списке - Lisp

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

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

Здравствуйте. Необходимо написать функцию, которая находит чаще всего встречающийся в списке атом типа "строка".
(defun moda (lst &optional (e nil) (d 0))
  (cond ((null lst) (list e d))
        (t (if (and (stringp (car lst)) (> (- (length lst) (length (remove (car lst) lst))) d))
               (moda (remove (car lst) lst) (car lst) (- (length lst) (length (remove (car lst) lst))))
               (moda (remove (car lst) lst) e d)))))
(moda '(1 1 1 "a" "a" a (a) (a) (a) "b" "b"))
. Подобный код нашел на этом форуме, немного модифицировал, но насколько я понял, то функция remove не удаляет все строки равные данной. Помогите пожалуйста решить данную задачу.

Решение задачи: «Поиск наиболее встречающегося элемента в списке»

textual
Листинг программы
(defun task (lst)
  (let* ((clst (remove-if-not 'stringp  lst)) ;; удалим все "не строки"
         (s (setof clst)) ;; берем набор уникальных строк
         (l (length clst)) ;; длина списка строк (с повторами)
         (f (mapcar #'(lambda (x) (list (- l (length (remove x clst))) x)) s)) ;; строим список пар (число-повт строка)
         (m (apply 'max (mapcar 'car f)))) ;; ищем максимум (самое частое повторение)
        (mapcar 'cadr (remove-if #'(lambda (x) (/= m (car x))) f)))) ;; оставляем только самые часто встречающиеся
 
==> task
 
(task '(1 2 3 "aa" "cc" "aa" 5 6 (5) "cc" "aa" "aa" "bb"))
 
==> ("aa")
 
(task '(1 2 3 "aa" "cc" "aa" 5 "cc" "cc" 6 (5) "cc" "aa" "aa" "bb"))
 
==> ("cc" "aa")

Объяснение кода листинга программы

В данном коде решается задача поиска наиболее часто встречающегося элемента в списке.

  1. Сначала определяется функция task, которая принимает список в качестве аргумента.
  2. Затем, с помощью remove-if-not из списка удаляются все элементы, которые не являются строками.
  3. Полученный список уникальных строк сохраняется в переменной s.
  4. Длина списка уникальных строк сохраняется в переменной l.
  5. С помощью mapcar и анонимной функции строится список пар (число-повт строка), где число - это длина списка, а строка - это соответствующий элемент из s.
  6. С помощью apply и функции max находится максимальное значение из списка пар.
  7. С помощью mapcar и функции cadr из списка пар удаляются элементы, которые не являются максимальными.
  8. Результатом работы функции task является список наиболее часто встречающихся элементов. Примеры вызовов функции task и ожидаемые результаты:
    • (task '(1 2 3aa`cc aa 5 6 (5) cc aa aa bb))` -> aa
    • (task '(1 2 3aa`cc aa 5 cc cc 6 (5) cc aa aa bb))-> ``cc `aa``

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


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

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

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