Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков - 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))

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

Вот что происходит в этом коде:

  1. Функция decart принимает два аргумента, s1 и s2, которые являются списками.
  2. В первой реализации функция использует два вложенных цикла iter для перебора элементов s1 и s2. Для каждой пары элементов a из s1 и b из s2 создается новый элемент list a b и добавляется в результат r.
  3. Во второй реализации функция использует функцию mapcar для создания списка функций, каждая из которых принимает элемент x из s1 и создает новый элемент list x y, где y - это каждый элемент из s2. Затем функция apply применяется к append, чтобы объединить все эти списки в один результат.
  4. В третьей реализации функция использует рекурсивную функцию 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.

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


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

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

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