Заменить повторяющиеся элементы на единицы - Lisp

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

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

Задана матрица А размера 4*7. Заменить в нем повторяющиеся элементы на единицы. Решить поставленную задачу на языке Лисп с применением многомерных массивов.

Решение задачи: «Заменить повторяющиеся элементы на единицы»

textual
Листинг программы
  1. (defun task (matr)
  2.   (labels ((get-rep (lst &optional (r nil))
  3.              (cond ((null lst) r)
  4.                    ((member (car lst) (cdr lst)) (get-rep (cdr lst) (cons (car lst) r)))
  5.                    (t (get-rep (cdr lst) r)))))
  6.           (let ((z (get-rep (apply 'append matr))))
  7.                (mapcar #'(lambda (row)
  8.                   (mapcar #'(lambda (c) (if (member c z) 1 c)) row)) matr))))      
  9.  
  10. ==> task
  11.  
  12. (task '((3 4 5) (4 6 8) (3 3 7)))
  13.  
  14. ==> ((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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы