Как фрукты положить на одну полку? - Lisp
Формулировка задачи:
Пользуюсь common lisp.
Не получается объединить списки, я вообще не понимаю, как их объединить через циклы
На полках в магазине лежат фрукты. Напишите программу, которая переложит все фрукты на одну полку.
⇒ (APPLE APPLE BANANA PINEAPPLE PINECONE ORANGE PEAR QIWI MANGO)
(defun flatten (l) (if l (if (atom l) (list l) (mapcan #'flatten l)))) (print (flatten '((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)
Объяснение кода листинга программы
В коде определены две функции:
- Функция
set-of
принимает на вход списокlst
и возвращает список, содержащий элементы из исходного списка без повторяющихся элементов. Функция рекурсивно вызывает саму себя, пока не будет получен список без элементов. - Функция
task
принимает на вход списокshelf
и возвращает список, содержащий все элементы из списков, входящих в списокshelf
. Функция сначала вызывает функциюset-of
, а затем применяет функциюappend
к результату. При вызове функцииtask
с аргументом((apple apple banana) (pineapple pinecone orange) (pear qiwi mango))
возвращается список((APPLE BANANA) (PINEAPPLE ORANGE) (PEAR MANGO QIWI)
. В этом списке все повторяющиеся элементы удалены, а все элементы из списков, входящих в исходный список, сохранены.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д