Обработка списка - Lisp (229463)
Формулировка задачи:
Решение задачи: «Обработка списка»
- (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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д