Scheme вложенные списки - Lisp
Формулировка задачи:
Всем привет, хочу задать такой вопрос: как соорудить процедуру, которая раскрывает вложенные списки?
При вызове процедуры (my-flatten '((1) 2 (3 (4 5)) 6)) , она должна на выходе выдавать аккуратненький список без скобок (1 2 3 4 5 6)
Нужен ли здесь хитрый предикат, с помощью которого программа будет понимать, что перед нами рекурсивное (car (car (car ...))) ?
Решение задачи: «Scheme вложенные списки»
textual
Листинг программы
(defun flat (lst) (cond ((null lst) nil) ((atom (car lst)) (cons (car lst) (flat (cdr lst)))) (t (append (flat (car lst)) (flat (cdr lst)))))) ==> flat (flat '(1 2 ((5 6) 7))) ==> (1 2 5 6 7) (flat '(1 2 ((5 6) (((0))) 7))) ==> (1 2 5 6 0 7)
Объяснение кода листинга программы
Функция flat принимает на вход список lst и возвращает список, содержащий только один уровень вложенности. Рекурсивный алгоритм функции для получения такого результата выглядит следующим образом:
- Если lst — это пустой список, то возвращается nil.
- Если lst — это атом, то возвращается сам атом.
- Если lst — это список, то возвращается результат рекурсивного вызова функции flat для car lst и cdr lst.
- Если lst — это не список, то возвращается пустой список.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д