Вывод результата функции в обратном порядке - Lisp
Формулировка задачи:
Добрый вечер. Мне необходимо удалить из списка каждый третий элемент и вывести список в обратном порядке.
По отдельности обе задачи решены на форуме. А вот соединить у меня не получается (да и возможно ли это?).
Удаление каждого третьего элемента.
Мой вариант, который показывает чёрти-что:
(defun del3 (lst &optional (c 1))
(cond ((null lst) nil)
((= c 3) (del3 (cdr lst) 1))
(t (cons (car lst) (del3 (cdr lst) (1+ c))))))(defun del3 (lst &optional (c 1))
(cond ((null lst) nil)
((= c 3) (del3 (cdr lst) 1))
(t (list (del3 (cdr lst) (1+ c)) (car lst)))))Решение задачи: «Вывод результата функции в обратном порядке»
textual
Листинг программы
(defun del3 (lst &optional (c 1) (r nil)) (cond ((null lst) r) ((= c 3) (del3 (cdr lst) 1 r)) (t (del3 (cdr lst) (+ 1 c) (cons (car lst) r))))) ==> DEL3 (del3 '(1 2 3 4 5 6 7 8 9 10)) ==> (10 8 7 5 4 2 1)
Объяснение кода листинга программы
В коде определена функция del3. Она принимает два аргумента: lst и c, а также опциональный аргумент r.
- Если
lstравноnil, то возвращаетсяr. - Если
cравно 3, то вызывается функцияdel3дляcdr lstи аргументомcувеличивается на 1, аrостается без изменений. - В противном случае, вызывается функция
del3дляcdr lst, при этомcувеличивается на 1, аrдополняется новым элементом, который является первым элементомlst, и остальными элементами, сохраненными вr. При вызове функцииdel3с аргументомlstравным'(1 2 3 4 5 6 7 8 9 10)иcравным 1, функция возвращает'(10 8 7 5 4 2 1). Это происходит потому, чтоcравно 1, поэтому для каждого элементаlstвызывается функцияdel3сcравным 2, 3, 4, 5, 6, 7, 8, 9, и 10. В результате получается обратный порядок элементовlst.