Вывод результата функции в обратном порядке - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д