Как фрукты положить на одну полку? - Lisp

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

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

Пользуюсь common lisp. Не получается объединить списки, я вообще не понимаю, как их объединить через циклы На полках в магазине лежат фрукты. Напишите программу, которая переложит все фрукты на одну полку.
(defun flatten (l) (if l (if (atom l) (list l) (mapcan #'flatten l))))
(print (flatten '((apple apple banana) (pineapple pinecone orange) (pear qiwi mango))))
⇒ (APPLE APPLE BANANA PINEAPPLE PINECONE ORANGE PEAR QIWI MANGO)

Решение задачи: «Как фрукты положить на одну полку?»

textual
Листинг программы
(defun set-of (lst)
  (cond ((null lst) nil)
        (t (cons (car lst) (set-of (remove (car lst) (cdr lst)))))))
 
==> SET-OF
 
(defun task (shelf)
  (set-of (apply 'append shelf)))
 
==> TASK
 
(task '((apple apple banana) (pineapple pinecone orange) (pear qiwi mango)))
 
==> (APPLE BANANA PINEAPPLE PINECONE ORANGE PEAR QIWI MANGO)

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

В коде определены две функции:

  1. Функция set-of принимает на вход список lst и возвращает список, содержащий элементы из исходного списка без повторяющихся элементов. Функция рекурсивно вызывает саму себя, пока не будет получен список без элементов.
  2. Функция task принимает на вход список shelf и возвращает список, содержащий все элементы из списков, входящих в список shelf. Функция сначала вызывает функцию set-of, а затем применяет функцию append к результату. При вызове функции task с аргументом ((apple apple banana) (pineapple pinecone orange) (pear qiwi mango)) возвращается список ((APPLE BANANA) (PINEAPPLE ORANGE) (PEAR MANGO QIWI). В этом списке все повторяющиеся элементы удалены, а все элементы из списков, входящих в исходный список, сохранены.

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


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

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

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