Проверка и реверсирование списка - Lisp
Формулировка задачи:
Проверяем подсписок на элементы с d по k, если таковые имеются, то выводим реверсированный список, если нет, то исходный.
Решение задачи: «Проверка и реверсирование списка»
textual
Листинг программы
(defun wtf2 (lst d k) (let ((pos-d (position d lst :test #'=)) (pos-k (position k lst :test #'=))) (cond ((or (null pos-k) (null pos-d)) (reverse lst)) (T (append (subseq lst 0 (+ pos-d 1)) (subseq lst pos-k (length lst))))))) * (wtf2 '(1 2 3 4 5 6 7 8 9 10) 5 10) (1 2 3 4 5 10) * (wtf2 '(1 2 3 4 5 6 7 8 9 10) 25 1) (10 9 8 7 6 5 4 3 2 1)
Объяснение кода листинга программы
В коде определена функция wtf2, которая принимает два аргумента: lst и d. Аргумент lst представляет собой список, который необходимо проверить и/или перевернуть, а аргумент d - это элемент, который необходимо найти в списке.
Внутри функции используется оператор let, чтобы создать две переменные: pos-d и pos-k. Переменная pos-d содержит позицию первого вхождения элемента d в списке lst, а переменная pos-k содержит позицию последнего вхождения элемента k в списке lst.
Затем используется оператор cond, чтобы проверить два условия:
- Если
pos-kилиpos-dравныnil, то это означает, что элементdилиkне найден в спискеlst. В этом случае функция возвращает перевернутый списокlst. - Если оба
pos-kиpos-dне равныnil, то это означает, что элементыdиkнайдены в спискеlst. В этом случае функция возвращает список, который состоит из двух частей: первая часть - это подстрока спискаlstот начала до позицииpos-d, а вторая часть - это подстрока спискаlstот позицииpos-kдо конца списка. Эти две части объединяются с помощью операцииappend. В конце кода приведены два примера вызова функцииwtf2: * (wtf2 '(1 2 3 4 5 6 7 8 9 10) 5 10)- функция вызывается с аргументамиlst=(1 2 3 4 5 6 7 8 9 10)иd=5,k=10. В этом случае функция возвращает перевернутый список(1 2 3 4 5 10).* (wtf2 '(1 2 3 4 5 6 7 8 9 10) 25 1)- функция вызывается с аргументамиlst=(1 2 3 4 5 6 7 8 9 10)иd=25,k=1. В этом случае функция возвращает перевернутый список(10 9 8 7 6 5 4 3 2 1).