Все возможные комбинации наборов и подмножества списка, удовлетворяющие условиям с CLISP
Формулировка задачи:
Решение задачи: «Все возможные комбинации наборов и подмножества списка, удовлетворяющие условиям с CLISP»
(defun all-subsets (lst) (cond ((null lst) (list nil)) (t (let ((c (all-subsets (cdr lst)))) (append c (mapcar #'(lambda (x) (cons (car lst) x)) c)))))) (all-subsets '(a b c d)) ==> (NIL (d) (c) (c d) (b) (b d) (b c) (b c d) (a) (a d) (a c) (a c d) (a b) (a b d) (a b c) (a b c d))
Объяснение кода листинга программы
В данном коде определённая функция all-subsets, которая принимает в качестве аргумента список lst.
Если список lst пустой, то возвращается список, содержащий только nil.
В противном случае, с помощью let определяется новая функция, которая рекурсивно вызывает all-subsets для списка, полученного путем удаления первого элемента из lst.
Кроме того, с помощью mapcar и лямбда-функции, которая принимает в качестве аргумента элемент, полученный путем получения первого элемента из lst, и добавляет его в начало каждого элемента в c, полученного в результате рекурсивного вызова.
В конце, с помощью append новый список, полученный с помощью лямбда-функции, добавляется к c.
Итоговый список, содержащий все возможные комбинации наборов и подмножества списка, удовлетворяющие условиям, выводится с помощью (all-subsets '(a b c d)).