Функция, разбивающая список на подсписки - Lisp

Узнай цену своей работы

Формулировка задачи:

Добрый день Не могли бы вы подсказать мне, как сделать функцию, которая разбивает список элементов таким образом: Допустим, на вход подаётся список (a a a c b b a c c b) С А выход: (a a a) (c) (b b) (a) (c c) (b) (задействованы car cdr и условный оператор)

Решение задачи: «Функция, разбивающая список на подсписки»

textual
Листинг программы
(define (task lst)
  (reverse (foldl (lambda (a b) (if (equal? a (first (first b)))
                                    (cons (cons a (first b)) (rest b))
                                    (cons (list a) b)))
                  (list (list (first lst)))
                  (rest lst))))
 
 
(task '(a a a b d c d b b c))
;'((a a a) (b) (d) (c) (d) (b b) (c)

Объяснение кода листинга программы

В коде определена функция task, которая принимает в качестве аргумента список lst. Сначала применена функция reverse к результату вызова foldl с следующей параметрной функцией: (lambda (a b) (if (equal? a (first (first b))) (cons (cons a (first b)) (rest b)) (cons (list a) b)) В этой функции используется условие equal? для определения, является ли первый элемент a первым элементом списка b. Если это так, то возвращается cons с двумя элементами: a и первый элемент b. В противном случае возвращается cons с одним элементом: a. Затем применяется функция cons для добавления полученного элемента в начало списка b. Результатом применения foldl является список, который затем обрабатывается функцией reverse. Затем результат reverse присваивается переменной task, и вызывается функция task с аргументом lst. Результат выполнения кода: ((a a a) (b) (d) (c) (d) (b b) (c)) Это разбиение исходного списка lst на подсписки, где первый элемент каждого подсписка является уникальным.

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


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

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

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