Многоуровневые усписки - Lisp
Формулировка задачи:
Определите функцию (f s n), где s - список, n - число. Функция должна возвращать n-ый атом из списка s. Список s может быть многоуровневым.
Например, если вызвать функцию (f '((a k) ((b d) (q w) f) g) 5), то программа должна выдать Q.
Решение задачи: «Многоуровневые усписки»
textual
Листинг программы
(defun task2 (lst n) (cond ((null lst) (cons n nil)) ((atom (car lst)) (print (car lst)) (if (= n 1) (car lst) (task2 (cdr lst) (- n 1)))) (t (let ((res (task2 (car lst) n))) (if (atom res) res (task2 (cdr lst) (car res)))))))
Объяснение кода листинга программы
В данном коде определен вспомогательный функция с именем task2, которая принимает два аргумента: lst и n.
Список lst представляет собой иерархическую структуру, которую необходимо обработать.
Цель функции task2 — рекурсивно обойти все элементы списка lst и для каждого из них выполнить следующие действия:
- Если список пуст, то возвращается
nil. - Если первый элемент списка является атомом, то он выводится на экран, а функция вызывается рекурсивно для оставшейся части списка с аргументом
n - 1. - Если первый элемент списка не является атомом, то он передается в функцию
task2для дальнейшей обработки. В последнем случае функцияtask2вызывается рекурсивно для оставшейся части списка с аргументомn - 1. При этом в качестве результата рекурсивного вызова сохраняется первый элемент нового списка, который в дальнейшем будет передан в следующую итерацию рекурсии. Таким образом, данный код позволяет выполнить обход многоуровневого списка и вывести на экран все его элементы.