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 и возвращает список, содержащий только один уровень вложенности. Рекурсивный алгоритм функции для получения такого результата выглядит следующим образом:

  1. Если lst — это пустой список, то возвращается nil.
  2. Если lst — это атом, то возвращается сам атом.
  3. Если lst — это список, то возвращается результат рекурсивного вызова функции flat для car lst и cdr lst.
  4. Если lst — это не список, то возвращается пустой список.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы