Как поменять местами в списке минимальный и первый элементы этого списка - Lisp
Формулировка задачи:
Суть задания : дан список из 15 чисел. Наименьшее число в этом списке поменять с первым числом.
Минимальный элемент найти легко, а вот поменять местами уже вызывает трудности. Самая большая трудность заключается в том что индексы использовать нельзя, как и циклы. Нужно все это реализовать через рекурсию, а вот реализовать это не получается.
Как поменять местами в списке минимальный и первый элементы этого списка, не зная позицию и индекса минимального элемента?
Решение задачи: «Как поменять местами в списке минимальный и первый элементы этого списка»
textual
Листинг программы
(defun first-min (w &optional (z (car w)) (m (reduce #'min w)) f &aux (a (car w))) (when w (if (= a m) (cons z (cdr w)) (cons (if f a m) (first-min (cdr w) z m t))))) > (first-min '(2 2 3 4 1 1)) (1 2 3 4 2 1)
Объяснение кода листинга программы
В коде представлена функция first-min, которая принимает список w и последовательность f в качестве аргументов. Если w не равен nil, то выполняется следующая последовательность действий:
- Переменная
zинициализируется значением первого элемента спискаw. - Переменная
mинициализируется значением минимального элемента спискаw. - Переменная
aинициализируется значением первого элемента спискаw. - Если
aравноm, то возвращается новый список, состоящий изzи всех остальных элементовw. - Если
aне равноm, то возвращается новый список, состоящий изmи всех остальных элементовw. В данном примере функцияfirst-minприменяется к списку(2 2 3 4 1 1). Поскольку первый и минимальный элементы списка равны2, то возвращается новый список(1 2 3 4 2 1).