Используя функции car и cdr необходимо извлечь из заданных списков элементы с указанными номерами - Lisp
Формулировка задачи:
Добрый день!
Помогите пожалуйста решить задачу:
Используя функции car и cdr необходимо извлечь из заданных списков эле-
менты с указанными номерами. В качестве результата выдайте список состав-
ленный из извлеченных элементов.
Списки:
Номера: 2, 3, 3.
(9 (() 8 88 888)) (H (J K L) (U J N)) (C B (N M I) (T Y U))
Решение задачи: «Используя функции car и cdr необходимо извлечь из заданных списков элементы с указанными номерами»
textual
Листинг программы
;; racket-lang.org (define (foo n lst) (if (> n 1) `(car ,(let loop ((n (sub1 n))) (if (= n 1) `(cdr ,lst) `(cdr ,(loop (sub1 n)))))) `(car ,lst))) (let ((data '((9 (() 8 88 888)) (H (J K L) (UJN)) (C B (N M I) (T Y U)))) (nums '(2 3 3))) (map (lambda (x y) (foo x y)) nums data)) #| '((car (cdr (9 (() 8 88 888)))) (car (cdr (cdr (H (J K L) (UJN))))) (car (cdr (cdr (C B (N M I) (T Y U)))))) |#
Объяснение кода листинга программы
В коде определена функция foo, которая принимает два аргумента: число n и список lst. Если n больше 1, то функция применяет рекурсию, извлекая указанный элемент из списка с помощью car и cdr. Если n равно 1, то функция извлекает последний элемент списка с помощью cdr.
Затем определена функция let, которая создает переменные data и nums и инициализирует их значениями соответствующих списков.
Далее, с помощью функции map происходит применение функции foo к каждому элементу списка nums и списку data. Результат выводится в консоль.
(foo 2 (9 (() 8 88 888)))(foo 3 (H (J K L) (UJN)))(foo 3 (C B (N M I) (T Y U)))