С Новым годом! Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
19 / 10 / 6
Регистрация: 28.05.2014
Сообщений: 140

Не получается переделать рекурсивный алгоритм поиска всех путей в графе в итеративный

06.01.2018, 23:54. Показов 1638. Ответов 0

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть рекурсивная функция поиска всех путей в графе:

Go
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
func (this *Graph) FindPath(from Word, to Word, visited Dict, current Path) {
    if from.Eq(to) {
        if len(current) > this.Max {
            this.Max = len(current)
            fmt.Println(current)
        }
 
        this.Pathes = append(this.Pathes, current)
        return
    }
 
    if visited.Index(from) != -1 {
        return
    }
 
    index := this.nodes.Index(from)
 
    if index == -1 {
        return
    }
 
    for r := 0; r < len(this.rules); r++ {
        index := from.Index(this.rules[r].Pat)
 
        if index == -1 {
            continue
        }
 
        vis := make(Dict, len(visited))
        copy(vis, visited)
        vis = append(vis, from)
 
        cur := make(Path, len(current))
        copy(cur, current)
        cur = append(cur, this.rules[r])
 
        this.FindPath(from.ApplyRule(this.rules[r]), to, vis, cur)
    }
}
Я попытался переделать ее в итеративную:
Go
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
53
54
func (this *Graph) FindPathes(from Word, to Word) {
    this.Pathes = make([]Path, 0)
    this.Max = 0
 
    nodes := stack.New()
    pathes := stack.New()
    visiteds := stack.New()
 
    nodes.Push(from)
    visiteds.Push(Dict{from})
    pathes.Push(make(Path, 0))
 
    for nodes.Len != 0 {
        curn := nodes.Pop().(Word)
        curp := pathes.Pop().(Path)
        curv := visiteds.Pop().(Dict)
 
        if curn.Eq(to) {
            if len(curp) > this.Max {
                this.Max = len(curp)
                fmt.Println(curp.ApplyVerbose(from))
            }
 
            this.Pathes = append(this.Pathes, curp)
            continue
        }
 
        for r := 0; r < len(this.rules); r++ {
            index := curn.Index(this.rules[r].Pat)
 
            if index == -1 {
                continue
            }
 
            newword := curn.ApplyRule(this.rules[r])
 
            if curv.Index(newword) != -1 {
                continue
            }
 
            newp := make(Path, len(curp))
            copy(newp, curp)
            newp = append(curp, this.rules[r])
 
            newv := make(Dict, len(curv))
            copy(newv, curv)
            newv = append(newv, newword)
 
            pathes.Push(newp)
            nodes.Push(newword)
            visiteds.Push(newv)
        }
    }
}
stack - самописная реализация стека, допустим, что там все правильно работает.

Word - []int
Dict - []Word
Path - []Rule
Rule - struct{Pat Word, Rep Word}

Index - для Dict и Path возвращает индекс нужного элемента (или -1), а для Word - место начала подстроки (или -1).

Word.Eq - проверяет два слова на равенство.

Первая функция работает верно, а вторая не завершает работу за разумное время. Не могли бы вы помочь?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2018, 23:54
Ответы с готовыми решениями:

Алгоритм флойда для поиска кратчайших путей в графе
алгоритм флойда для поиска кратчайших путей в графе. Вывожу длину путей между вершинами, не могу вывести вершины которые попадают в...

Алгоритм поиска всех деревьев в графе
Имеется граф. Необходимо найти множество всех деревьев. Где дерево это минимальная неизбыточная совокупность ребер удовлетворяющая...

Алгоритм для поиска всех путей между 2 вершинами графа
здраствуйте помогите написать программу

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2018, 23:54
Помогаю со студенческими работами здесь

Алгоритм для поиска всех путей между 2 вершинами графа
Здравствуйте, возник вопрос какой алгоритм необходимо использовать для поиска всех путей, между 2 вершинами графа.

Задача поиска множественных путей в графе
Добрый день. Возникла задача поиска множественных путей в графе. Задача объемная и по объему вычислений и по памяти. По моему разумению...

Реализовать программу поиска путей в графе
нужно сделать граф 8 вершин И сделать одно из трех. 1. Поиск всех путей в неориентированном графе 2. Поиск кратчайшего пути в графе ...

Обход всех путей в графе
Помогите с алгоритмом поиска всех путей на графе.Обыскал весь инет робочего не нашол

Обход всех путей в графе
Помогите с алгоритмом поиска всех путей на графе.Обыскал весь инет робочего не нашол


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru