Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков - Lisp

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

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

Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков. Например для множеств X=(A B C) и Y=(2 3) результатом вызова (CARTEZIAN X Y) будет список ((A 2) (A 3) (B 2) (B 3) (C 2) (C 3) ).

Решение задачи: «Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков»

textual
Листинг программы
  1. (defun decart (s1 s2)
  2.  (let ((r nil))
  3.   (iter (for a in s1)
  4.     (iter (for b in s2) (collecting (list a b) into r))) r))
  5.  
  6.  
  7. ==> DECART
  8.  
  9. (decart '(a b c) '(1 2 3))
  10.  
  11. ==> ((A 1) (A 2) (A 3) (B 1) (B 2) (B 3) (C 1) (C 2) (C 3))
  12.  
  13. (defun decart (s1 s2)
  14.  (apply 'append (mapcar (lambda (x) (mapcar (lambda (y) (list x y)) s1)) s2)))
  15.  
  16. ==> DECART
  17.  
  18. (decart '(a b c) '(1 2 3))
  19.  
  20. ==> ((1 A) (1 B) (1 C) (2 A) (2 B) (2 C) (3 A) (3 B) (3 C))
  21.  
  22. (defun decart (s1 s2)
  23.   (labels ((f (x lst)
  24.               (cond ((null lst) nil)
  25.                     (t (cons (list x (car lst)) (f x (cdr lst)))))))
  26.            (cond ((null s1) nil)
  27.                  (t (append (f (car s1) s2) (decart (cdr s1) s2))))))
  28.  
  29. ==> DECART
  30.  
  31. (decart '(a b c) '(1 2 3))
  32.  
  33. ==> ((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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы