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