Заменить повторяющиеся элементы на единицы - 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))

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

В этом коде:

  1. Функция task принимает на вход матрицу строк.
  2. Внутри функции определён вспомогательный вспомогательный рекурсивный функционал get-rep, который принимает на вход список и ищет в нём повторяющиеся элементы. Если список пустой, то возвращается результат поиска, если не пустой, то рекурсивно вызывается get-rep для оставшейся части списка, а в качестве результата поиска возвращается новый список, в котором найденный элемент встречается один раз.
  3. В функции task создаётся новый список z, в котором с помощью get-rep находятся все повторяющиеся элементы из исходной матрицы.
  4. С помощью mapcar и лямбда-функции, которая проверяет, является ли элемент списка повторяющимся, осуществляется замена повторяющихся элементов в исходной матрице на единицы.
  5. Результатом работы функции task является изменённая матрица. Код можно оптимизировать, если вместо рекурсивного вызова функции get-rep использовать итеративный цикл.

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


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

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

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