Заменить повторяющиеся элементы на единицы - Lisp
Формулировка задачи:
Задана матрица А размера 4*7. Заменить в нем повторяющиеся элементы на единицы.
Решить поставленную задачу на языке Лисп с применением многомерных массивов.
Решение задачи: «Заменить повторяющиеся элементы на единицы»
textual
Листинг программы
(defun task (matr) (labels ((get-rep (lst &optional (r nil)) (cond ((null lst) r) ((member (car lst) (cdr lst)) (get-rep (cdr lst) (cons (car lst) r))) (t (get-rep (cdr lst) r))))) (let ((z (get-rep (apply 'append matr)))) (mapcar #'(lambda (row) (mapcar #'(lambda (c) (if (member c z) 1 c)) row)) matr)))) ==> task (task '((3 4 5) (4 6 8) (3 3 7))) ==> ((1 1 5) (1 6 8) (1 1 7))
Объяснение кода листинга программы
В этом коде:
- Функция
task
принимает на вход матрицу строк. - Внутри функции определён вспомогательный вспомогательный рекурсивный функционал
get-rep
, который принимает на вход список и ищет в нём повторяющиеся элементы. Если список пустой, то возвращается результат поиска, если не пустой, то рекурсивно вызываетсяget-rep
для оставшейся части списка, а в качестве результата поиска возвращается новый список, в котором найденный элемент встречается один раз. - В функции
task
создаётся новый списокz
, в котором с помощьюget-rep
находятся все повторяющиеся элементы из исходной матрицы. - С помощью
mapcar
и лямбда-функции, которая проверяет, является ли элемент списка повторяющимся, осуществляется замена повторяющихся элементов в исходной матрице на единицы. - Результатом работы функции
task
является изменённая матрица. Код можно оптимизировать, если вместо рекурсивного вызова функцииget-rep
использовать итеративный цикл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д