Найти в каждой строке наибольший элемент и элемент главной диагонали и поменять их местами - Lisp

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

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

Найти в каждой строке наибольший элемент и элемент главной диагонали и поменять их местами.

Решение задачи: «Найти в каждой строке наибольший элемент и элемент главной диагонали и поменять их местами»

textual
Листинг программы
(defun main-dmax (w &optional (n 0) &aux (a (car w)))
  (when w (cons (progn
                  (rotatef (nth (position (reduce #'max a) a) a)
                           (nth n a))
                  a)
                (main-dmax (cdr w) (1+ n)))))
 
> (main-dmax '((1 2 3) (4 5 6) (7 8 9)))
((3 2 1) (4 6 5) (7 8 9))
> (main-dmax '((1 22 3) (44 5 6) (77 8 9)))
((22 1 3) (5 44 6) (9 8 77))

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

В этом коде определена функция main-dmax, которая принимает строку w и номер строки n в качестве входных данных. Опциональный аргумент n имеет значение 0 по умолчанию. Внутри функции используется вспомогательная переменная a, которая сначала содержит первый элемент строки w. Если w не является пустой, то функция cons создаёт новый список, содержащий два элемента:

  1. Результат вызова функции progn, которая сначала находит максимальное значение в списке a с помощью функции reduce и функции max.
  2. Затем функция rotatef меняет местами это максимальное значение с элементом в позиции n в списке a.
  3. После этого функция cons создаёт новый список, содержащий результаты progn и rotatef, а также исходный список a.
  4. Если w является пустой, то функция cons создаёт новый список, содержащий только исходный список a.
  5. Наконец, функция main-dmax рекурсивно вызывается для оставшейся части строки w и нового значения n, увеличенного на 1. Пример использования функции main-dmax со списком w = '((1 22 3) (44 5 6) (77 8 9)): — На первом шаге функция main-dmax вызывает вспомогательную функцию progn, которая находит максимальное значение в списке (1 22 3), то есть 3. — Затем функция rotatef меняет местами 3 и элемент в позиции 1 в списке (1 22 3), то есть результат progn3, становится 2, а элемент в позиции 1 становится 3. — На следующем шаге функция main-dmax вызывается рекурсивно для списка (44 5 6) и нового значения n = 2. — На этом шаге функция progn находит максимальное значение в списке (44 5 6), то есть 6. — Затем функция rotatef меняет местами 6 и элемент в позиции 2 в списке (44 5 6), то есть результат progn6, становится 5, а элемент в позиции 2 становится 6. — На следующем шаге функция main-dmax вызывается рекурсивно для списка (77 8 9) и нового значения n = 3. — На этом шаге функция progn находит максимальное значение в списке (77 8 9), то есть 9. — Затем функция rotatef меняет местами 9 и элемент в позиции 3 в списке (77 8 9), то есть результат progn9, становится 8, а элемент в позиции 3 становится 9. — Наконец, функция cons создаёт новый список, содержащий результаты progn и rotatef, а также исходный список a, то есть (2 5 3) (6 44 9) (8 77).

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

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