Выбрать из списка каждый третий элемент - 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).