Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков - Lisp
Формулировка задачи:
Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков.
Например для множеств X=(A B C) и Y=(2 3) результатом вызова (CARTEZIAN X Y)
будет список ((A 2) (A 3) (B 2) (B 3) (C 2) (C 3) ).
Решение задачи: «Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков»
textual
Листинг программы
- (defun decart (s1 s2)
- (let ((r nil))
- (iter (for a in s1)
- (iter (for b in s2) (collecting (list a b) into r))) r))
- ==> DECART
- (decart '(a b c) '(1 2 3))
- ==> ((A 1) (A 2) (A 3) (B 1) (B 2) (B 3) (C 1) (C 2) (C 3))
- (defun decart (s1 s2)
- (apply 'append (mapcar (lambda (x) (mapcar (lambda (y) (list x y)) s1)) s2)))
- ==> DECART
- (decart '(a b c) '(1 2 3))
- ==> ((1 A) (1 B) (1 C) (2 A) (2 B) (2 C) (3 A) (3 B) (3 C))
- (defun decart (s1 s2)
- (labels ((f (x lst)
- (cond ((null lst) nil)
- (t (cons (list x (car lst)) (f x (cdr lst)))))))
- (cond ((null s1) nil)
- (t (append (f (car s1) s2) (decart (cdr s1) s2))))))
- ==> DECART
- (decart '(a b c) '(1 2 3))
- ==> ((A 1) (A 2) (A 3) (B 1) (B 2) (B 3) (C 1) (C 2) (C 3))
Объяснение кода листинга программы
Вот что происходит в этом коде:
- Функция
decart
принимает два аргумента,s1
иs2
, которые являются списками. - В первой реализации функция использует два вложенных цикла
iter
для перебора элементовs1
иs2
. Для каждой пары элементовa
изs1
иb
изs2
создается новый элементlist a b
и добавляется в результатr
. - Во второй реализации функция использует функцию
mapcar
для создания списка функций, каждая из которых принимает элементx
изs1
и создает новый элементlist x y
, гдеy
- это каждый элемент изs2
. Затем функцияapply
применяется кappend
, чтобы объединить все эти списки в один результат. - В третьей реализации функция использует рекурсивную функцию
f
, которая принимает элементx
и списокlst
. Еслиlst
являетсяnil
, функция возвращаетnil
. В противном случае она создает новый элементlist x (car lst)
и применяетf
к оставшейся части спискаcdr lst
. В функцииdecart
используется условиеcond
, чтобы проверить, является лиs1
илиs2
nil
. Если это так, функция возвращаетnil
. В противном случае она применяетappend
к результатуf
и рекурсивно вызываетdecart
для оставшейся части спискаcdr s1
иs2
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д