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