Самый частый элемент - Lisp
Формулировка задачи:
Не могу понять,как написать программу,которая читает трехмерный массив, содержащий вещественные числа, из стандартного потока ввода, и определяет, какое число встречается в массиве чаще всего, и выводит на экран количество вхождений.
Решение задачи: «Самый частый элемент»
textual
Листинг программы
(defun task-3 (a) (let ((la (array-dimensions a)) (v nil) (p nil) (al nil)) (dotimes (i (car la) t) (dotimes (j (cadr la) t) (dotimes (k (caddr la) t) (setf v (aref a i j k)) (setf p (assoc v al)) (if (null p) (push (cons v 1) al) (push (cons v (+ 1 (cdr p))) al))))) (apply #'max (mapcar #'cdr al))))
Объяснение кода листинга программы
В данном коде реализован алгоритм поиска самого частого элемента в массиве.
- Создается функция
task-3
, которая принимает в качестве аргумента массивa
. - В блок
let
создаются следующие переменные:la
- размеры массиваa
.v
- текущий элемент массиваa
.p
- ассоциативный массив, где ключами являются элементы массиваa
, а значениями - их частота.al
- список кортежей, содержащих элементы массиваa
и их частоту.
- С помощью цикла
dotimes
перебираются все индексы массиваa
. - Внутри цикла
dotimes
перебираются все индексы второго измерения массиваa
. - Внутри цикла
dotimes
перебираются все индексы третьего измерения массиваa
. - Элемент массива
a
с индексамиi
,j
,k
присваивается переменнойv
. - Для этого элемента ищутся его предыдущие значения в переменной
p
. Если такого элемента нет, то создается новый кортеж(v 1)
и добавляется в конец спискаal
. Если элемент уже есть, то к его частоте прибавляется единица и создается новый кортеж(v (+ 1 (cdr p))
, который добавляется в конец спискаal
. - После завершения третьего цикла
dotimes
, в переменнойal
будет список кортежей, содержащих элементы массиваa
и их частоту. - С помощью функции
apply
и функцииmax
находится максимальное значение в списке кортежейal
. - Результатом работы функции
task-3
будет самый частый элемент массиваa
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д