![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
LFC |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.12.2008 Репутация: нет Всего: нет |
Пожайлуста напишите алгоритм этой программы, я что-то запуталась в ней
defun svyaz(r v) (cond ((null v) '(Input Vershini)) ;Введите вершины ((null (ser r v)) '(Graph coherent)) ;Если выполняется, то граф связный ) ) ;ребра, вершины, список смежных вершин (defun getsv(r v z) (cond ((and (eql (first(first r)) v) (not(eql (second(first r)) v))) (getsv (rest r) v (cons(second(first r)) z))) ((and (eql (second(first r)) v) (not(eql (first(first r)) v)))(getsv (rest r) v (cons(first(first r)) z))) (t (if (null r) z (getsv (rest r) v z)) )) ) (defun per(r v z) (cond ((null v) z) ( (member(first v) z) (per r (remove-duplicates(append (rest v) (getsv r (first v) nil))) (remove (first v) z)) ) (t (per r (rest v) z) ) ) ) (defun ser(r z) (per r (getsv r (first z) nil) (rest z)) ) Это сообщение отредактировал(а) LFC - 22.12.2008, 18:50 |
|||
|
||||
LFC |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.12.2008 Репутация: нет Всего: нет |
Задание у этой программы такое: написать программу на XLisp, определяющую, является ли данный неориентированный граф связным. Указание: запрограммировать предварительно предикат (path X Y), проверяющий, существует ли путь из вершины X в вершину Y. |
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 1 Всего: 11 |
Каким образом представлен граф?
|
|||
|
||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
;проверяет связанность графа.
(defun svyaz(r v) (cond ((null v) '(Input Vershini)) ;Введите вершины ((null (ser r v)) '(Graph coherent)) ;Если выполняется, то граф связный ) ) ;ребра, вершины, список смежных вершин ;дает список всех связанных вершин по списку ребер для данной вершины и списку связанных вершин (defun getsv(r v z) (cond ((and (eql (first(first r)) v) ;если первая вершина первого ребра равна вершине (not(eql (second(first r)) v))) ; и вторая вершина первого ребра не равна вершине ;то рекурсия по отатку ребер со списокм связанных вершин в который ;в который добавлена вторая вершина первого ребра (getsv (rest r) v (cons(second(first r)) z))) ;аналогично первому но проверяется вторая вершина первого ребра ((and (eql (second(first r)) v) (not(eql (first(first r)) v))) (getsv (rest r) v (cons(first(first r)) z))) ;если ребер не осталось возвращается список вершин связанных с данной. ;иначе проверяется остаток ребер рекурсивно. (t (if (null r) z (getsv (rest r) v z)) )) ) ;возвращает список вершин z которые не связаны со списоком вершин v (defun per(r v z) (cond ((null v) z);прерывание рекурсии если вершин не осталось возвращается список связанных вершин ((member (first v) z) (per r (remove-duplicates (append (rest v) ;из списка вершин удаляется текущая и добавляются те которые с ней связаны. (getsv r (first v) nil))) (remove (first v) z))) ;из списка связанных вершин удаляется текущая (t (per r (rest v) z) ) ;если первой вершины из списка вершин не оказалось в списке связанных вершин то проверются остальные ) ) ;возвращает список вершин которые не связанны с первой вершиной из списка z (defun ser(r z) (per r (getsv r (first z) nil) (rest z)) ) Добавлено через 14 минут и 31 секунду (setq r '((1 2) (2 3) (3 1))) (setq r '((1 2) (2 3) (3 1)(4 5)(5 6)(6 7)(7 5) )) (svyaz r '(1 2 3 5 6 7 )) тут получается две не связанные области и граф не когерентный если брать второй случай графа (svyaz r '(1)) а тут всегда когерентный какой бы мы граф не брали. |
|||
|
||||
LFC |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.12.2008 Репутация: нет Всего: нет |
(getsv r (first v) nil))) а в этом случае что делает? |
|||
|
||||
cooper123 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 30.7.2007 Репутация: нет Всего: нет |
(getsv r (first v) nil))) а в этом случае что делает?
выдает список всех вершин которые связаны с первой (first v) вершиной. для графа r |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |