Обработка списка - Lisp (229463)
Формулировка задачи:
Доброго времени суток.
Есть задание - написать fuнкцию, кoтoрая, выдает элeмeнт-список пo заданoму нoмeру n из задaннoгo списка, cчитaя его oт начала.
Дано:
’((12) (3 0) 8 5 a (e t) g u) и n=3
результатом будет (e t)
Прошу помощи, проходим рекурсивные функции, поэтому если есть возможность то лучше с использованием рекурсии.
Решение задачи: «Обработка списка»
textual
Листинг программы
(defun n-list (w n) (cond ((null w) nil) ((and (= n 1) (listp (car w))) (car w)) ((listp (car w)) (n-list (cdr w) (1- n))) (t (n-list (cdr w) n)))) > (n-list '((12) (3 0) 8 5 a (e t) g u) 3) (E T) > (n-list '((12) (3 0) 8 5 a (e t) g u) 4) NIL
Объяснение кода листинга программы
В коде определён функционал для обработки списков. При вызове функции n-list с двумя позиционными аргументами, первым из которых является список w, вторым — целое число n, возвращается либо первый элемент списка w, если n равно 1 и список является кучей (т.е. состоит только из одного элемента), либо рекурсивный вызов функции n-list с аргументами cdr w и (1- n) (где cdr w — это список, полученный путём удаления первого элемента из w, а (1- n) — это число, уменьшенное на единицу), если n больше 1 и первый элемент списка w является кучей. В случае, если n равно 0 или w равно nil, возвращается nil.
Пример использования функции:
> (n-list '((12) (3 0) 8 5 a (e t) g u) 3)Результат:(E T)Объяснение: Приn=3возвращается первый элемент спискаw, так как(3 0)— это куча (т.е. список, состоящий только из одного элемента).> (n-list '((12) (3 0) 8 5 a (e t) g u) 4)Результат:NILОбъяснение: Приn=4иwне равномnilи не являющемся кучей, рекурсивный вызов функцииn-listс аргументами(cdr w)и(1- n)происходит до тех пор, покаnне станет равным 0. В итоге возвращаетсяnil.