Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
1

Декартово произведение множеств

02.12.2013, 02:01. Показов 6343. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написать функцию, образующую декартово произведение двух заданных множеств X и Y. Функция должна формировать лексикографически упорядоченный список, элементами которого являются всевозможные списки, содержащие по два элемента каждый, причем первый элемент берется из множества X, а второй – из Y.

функция написана, но не выполняется условие лексическографически упорядоченных списков. помогите понять какими методами его преобразовать

Lisp
1
2
3
4
5
6
7
(defun decart (x y)
(setq dek ())
(do ((i 0 (+ i 1))) ((= i (length x)))
(setq z ())
(do ((j 0 (+ j 1))) ((= j (length y))) (setq z (cons (nth i x)
(cons (nth j y) nil))) (push z dek)))
(reverse dek))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2013, 02:01
Ответы с готовыми решениями:

Используя отображающие функционалы построить декартово произведение двух множеств
Всем доброго времени суток! помогите решить задачки. очень надо, а не получается. С помощью...

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

Как найти декартово произведение
Здравствуйте, вот такая проблема, мне надо найти декартово произведение, нашел функцию CART, вот...

Декартово произведение множеств
Посчитайте |(A\times B)\backslash (C\times...

24
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
02.12.2013, 03:21 2
А почему не выполняется? Можете неработающий пример?

Вообще, ужасно написано. Если интересно, могу рассказать, почему.
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 03:27  [ТС] 3
пример выполняется по идее правильно, но нет упорядочения. он просто создает список из декартовых произведений. мне бы понять что сделать, чтобы и это условие выполнялось. может вы подскажете? я не знаю как еще его переделать. программировать на этом языке почти не умею. учусь
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
02.12.2013, 03:39 4
Ничё не понял. Декартово произведение двух множеств в математике - это множество пар. В лиспе множеств нет, списки перемножаем. При перемножении (a b) на (1 2 3) по вашей функции получается ((a 1) (a 2) (a 3) (b 1) (b 2) (b 3)) - лексикографически упорядоченный список-произведение. Непонятно, что вам не нравится.
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 04:03  [ТС] 5
а если я возьму списки (в с а) и (5 3 7), например. то мне нужно, чтобы выглядело как ((а 3) (а 5) (а 7) (а 5) (в 5) ... (с 7) ). это требует задание. функция этого не выполняет
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36608 / 20335 / 4222
Регистрация: 12.02.2012
Сообщений: 33,657
Записей в блоге: 13
02.12.2013, 10:17 6
Лучший ответ Сообщение было отмечено как решение

Решение

Трудно не согласиться с Helter-ом: написано не лучшим образом... Вот три решения этой задачи:


Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
;; Рекурсия
 
(defun decart-r (x y &optional (s y))
  (cond ((null x) nil)
        ((null y) (decart-r (cdr x) s s))
        (t (cons (list (car x) (car y)) (decart-r x (cdr y) s))))) 
                
==> decart-r
 
(decart-r '(1 2 3 4) '(11 22 33))
 
==> ((1 11) (1 22) (1 33) (2 11) (2 22) (2 33) (3 11) (3 22) (3 33) (4 11) (4 22) (4 33))
 
;; Функционалы
 
(defun decart-f (x y)
 (apply 'append (mapcar #'(lambda (a) (mapcar #'(lambda (b) (list a b)) y)) x))) 
 
==> decart-f
 
(decart-f '(1 2 3 4) '(11 22 33))
 
==> ((1 11) (1 22) (1 33) (2 11) (2 22) (2 33) (3 11) (3 22) (3 33) (4 11) (4 22) (4 33))
 
;; Итерация (iter)
 
(defun decart-i (x y)
 (let ((r nil))
  (iter (for i in x)
    (iter (for j in y)
      (collecting (list i j) into r)))
 r))
 
==> decart-i
 
(decart-i '(1 2 3 4) '(11 22 33))
 
==> ((1 11) (1 22) (1 33) (2 11) (2 22) (2 33) (3 11) (3 22) (3 33) (4 11) (4 22) (4 33))
 
;; Итерация dolist
 
(defun decart-ii (x y)
 (let ((r nil))
   (dolist (i (reverse x) r)
     (dolist (j (reverse y) t)
       (push (list i j) r)))))
 
==> decart-ii
 
(decart-ii '(1 2 3 4) '(11 22 33))
 
==> ((1 11) (1 22) (1 33) (2 11) (2 22) (2 33) (3 11) (3 22) (3 33) (4 11) (4 22) (4 33))
Добавлено через 1 минуту
Цитата Сообщение от yulia137 Посмотреть сообщение
это требует задание. функция этого не выполняет
- для этого нужно просто предварительно отсортировать второй сомножитель.

Добавлено через 3 минуты
Lisp
1
2
3
4
5
6
7
8
(defun decart (x y)
  (decart-f x (qsort y)))  ;; вместо decart-f можно поставить любую из приведенных выше
 
==> decart
 
(decart '(a b) '(5 3 7))
 
==> ((a 3) (a 5) (a 7) (b 3) (b 5) (b 7))  ;; оно ???
3
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 20:19  [ТС] 7
вы не поняли наверное, но функция должна быть одна. и макросы, рекурсию, функционалы использовать нельзя. вот через dolist, думаю, подойдет реализация
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36608 / 20335 / 4222
Регистрация: 12.02.2012
Сообщений: 33,657
Записей в блоге: 13
02.12.2013, 20:27 8
Цитата Сообщение от yulia137 Посмотреть сообщение
думаю, подойдет реализация
- думаю, все пойдут...
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 20:46  [ТС] 9
только я все равно не поняла как списки упорядочить. что я пробую, интерпретатор не воспринимает. пробую как раз через dolist
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36608 / 20335 / 4222
Регистрация: 12.02.2012
Сообщений: 33,657
Записей в блоге: 13
02.12.2013, 20:54 10
Цитата Сообщение от yulia137 Посмотреть сообщение
только я все равно не поняла как списки упорядочить
- вызвать сортировку. По-другому - никак. Сами они не упорядочатся. А сортировку можно взять стандартную или реализовать свою.
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 20:56  [ТС] 11
я знаю сортировку стандартную только (sort [список из цифр] '> или '<). но с буквами она не работает и не подставляется в функцию. сразу мне nil выдает и все
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36608 / 20335 / 4222
Регистрация: 12.02.2012
Сообщений: 33,657
Записей в блоге: 13
02.12.2013, 21:18 12
Вот как можно сортировать символы в любом нужном порядке:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
;; функция проверяет, стоят ли символы x и y в том порядке, в каком они стоят 
;; в упорядочивающем списке L
 
 (defun Order (x y L) 
    (COND ((NULL L) NIL) 
              ((equal x (CAR L)) T) 
              ((equal y (CAR L)) NIL) 
              (T (order x y (CDR L)))))
 
;; Быстрая сортировка символов
 
(defun qsorts (lst)
 (let ((olist '(a b c d e f g h i j k l m n o p q r s t u v w x y z)))
   (cond ((null lst) nil)
         (t (append (qsorts (remove-if-not #'(lambda (x) (order x (car lst) olist)) (cdr lst)))
                    (list (car lst))
                    (qsorts (remove-if #'(lambda (x) (order x (car lst) olist)) (cdr lst))))))))
 
(qsorts '(q w e r t y u i o p))
 
==> (e i o p q r T u w y)
1
1050 / 944 / 107
Регистрация: 04.11.2012
Сообщений: 974
Записей в блоге: 3
02.12.2013, 21:42 13
Не хочу показаться занудным, но мне кажется есть смысл в такой форме записи для ФВП.
Lisp
1
2
3
;Restructuring.
(defmacro RS (&rest body)
  `(,(first body) ,(third body) ,(second body)))
Тогда Декартово произведение могло бы выглядеть так:
Lisp
1
2
3
4
5
6
(defun decart (x y)
  (RS mapcan x #'(lambda (col)
  (RS mapcar y #'(lambda (row) (list col row))))))
 
> (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))
Сразу видно какой аргумент является колонками, а какой рядами.

Кстати быстрая сортировка тогда выглядит так:
Lisp
1
2
3
4
5
6
7
8
(defun qsorts (lst)
  (let ((olist '(a b c d e f g h i j k l m n o p q r s t u v w x y z)))
    (cond
      ((null lst) nil)
      (t (append
         (qsorts (RS remove-if-not (cdr lst) #'(lambda (x) (order x (car lst) olist))))
         (list (car lst))
         (qsorts (RS remove-if (cdr lst) #'(lambda (x) (order x (car lst) olist)))))))))
Ы.
1
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 21:42  [ТС] 14
спасибо за помощь, попробую еще поразбираться, хотя все равно это не то
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36608 / 20335 / 4222
Регистрация: 12.02.2012
Сообщений: 33,657
Записей в блоге: 13
02.12.2013, 21:44 15
Цитата Сообщение от yulia137 Посмотреть сообщение
хотя все равно это не то
- почему?
1
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 21:47  [ТС] 16
это задание из лабораторной работы, а в ней по плану мы еще не проходили рекурсию, функционалы и макросы. только через итерацию можно. через dolist, которую уже реализовали, подходит как нельзя лучше, но все равно не выполняет всего задания

Добавлено через 3 минуты
потому что в задании нет решения из 2-3 функций. она должна быть одна и сразу выполнять все условия. надо либо это все как-то объединить, либо заново переписать. и можно списки, в которых содержится в 2 элемента, это конечно задачку упрощает
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
02.12.2013, 22:34 17
Цитата Сообщение от yulia137 Посмотреть сообщение
а если я возьму списки (в с а) и (5 3 7), например. то мне нужно, чтобы выглядело как ((а 3) (а 5) (а 7) (а 5) (в 5) ... (с 7) ). это требует задание. функция этого не выполняет
Кстати, лексикографическое упорядочивание - это для мономов. Вы и числа "лексикографически" упорядочиваете?

Сдаётся, вы превратно толкуете задание.
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
02.12.2013, 23:22  [ТС] 18
я делала с буквами. однако цифры тоже можно упорядочить
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36608 / 20335 / 4222
Регистрация: 12.02.2012
Сообщений: 33,657
Записей в блоге: 13
03.12.2013, 09:42 19
Цитата Сообщение от helter Посмотреть сообщение
Сдаётся, вы превратно толкуете задание.
- и у меня такое впечатление...
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 31
03.12.2013, 12:23  [ТС] 20
может быть тогда сами его еще раз перечитаете? и пользоваться рекурсией, макросами и функционалами ни в коем случае нельзя. вот вроде там все понятно описано. а я могу много чего сказать, если меня сразу не поймут
0
03.12.2013, 12:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2013, 12:23
Помогаю со студенческими работами здесь

Декартово произведение множеств
всем привет. помогите пожалуйста написать программу, которая будет считать декартово произведение и...

Декартово произведение множеств
Найти n-ю степень множества X=\{\{ \empty\}, y\}, если n=2

Декартово произведение множеств
Составьте программу, которая как входные данные получает два множества A, B и образует декартовы...

Декартово произведение двух множеств
Изобразите на координатной плоскости декартово произведение двух множеств АхВ, если:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru