Выбрать из списка каждый третий элемент - Lisp
Формулировка задачи:
Решение задачи: «Выбрать из списка каждый третий элемент»
(defun thirds (w &optional ac) (if (cddr w) (thirds (cdddr w) (cons (caddr w) ac)) (nreverse ac))) > (thirds '(1 2 3 4 5 6)) (3 6)
Объяснение кода листинга программы
В коде представлена функция thirds
, которая принимает два аргумента: w
и ac
. Аргумент w
является списком, а аргумент ac
— ассоциативным списком.
Если w
не является пустым списком, то функция thirds
вызывает саму себя, передавая в качестве аргументов cddr w
(оставшаяся часть списка w
после удаления первого элемента) и cons (caddr w) ac
(новый элемент списка ac
, полученный путем добавления третьего элемента списка w
в начало списка ac
).
Если w
является пустым списком, то функция thirds
вызывает функцию nreverse
для переменной ac
(возвращает список ac
в обратном порядке) и возвращает результат.
В примере использования функции thirds
передается список '(1 2 3 4 5 6)
в качестве аргумента w
. Функция thirds
вызывает себя рекурсивно для списка '(3 4 5 6)
и добавляет третий элемент списка '(3 4 5 6)
(который является числом 6
) в начало списка ac
. Затем функция вызывает себя снова для списка '(4 5 6)
и добавляет третий элемент списка '(4 5 6)
(который является числом 6
) в начало списка ac
. Наконец, функция вызывает себя еще раз для списка '(5 6)
и добавляет третий элемент списка '(5 6)
(который является числом 6
) в начало списка ac
. В результате функция возвращает список '(3 6)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д