|
Как реализовать обход дерева значений с неизвестным количеством уровней | ☑ | ||
---|---|---|---|---|
0
sidalexsandr
06.06.16
✎
13:13
|
Как реализовать обход дерева значений с неизвестным количеством уровней
|
|||
1
Волшебник
модератор
06.06.16
✎
13:13
|
рекурсивно
|
|||
2
mistеr
06.06.16
✎
13:22
|
(0) Есть такое волшебное слово - ... А черт, Волшебник уже все сказал.
|
|||
3
1dvd
06.06.16
✎
13:23
|
можно и без рекурсии
|
|||
4
Nuobu
06.06.16
✎
13:23
|
Присоединяюсь к первому оратору.
|
|||
5
Зая Бусечка
06.06.16
✎
13:24
|
Любую рекурсию, как нас учат большевики и гуру, можно заменить циклом.
|
|||
6
mistеr
06.06.16
✎
13:28
|
(5) Только вот провернуть это с ДЗ будет непросто.
|
|||
7
Wern
06.06.16
✎
13:42
|
(6) Да ладно. там же способов море, например такой
мДанных=Новый Массив; точкаЧтения=0; мДанных.Добавить(Дерево); Для Количество=1 По 1000 Цикл//ограничиваем количество чтоб не зациклится случайно Для Каждого Строка Из мДанных[точкаЧтения].Строки Цикл мДанных.Добавить(Строка); КонецЦикла; точкаЧтения=точкаЧтения+1; Если мДанных.Количество()<=точкаЧтения Тогда Прервать; КонецЕсли; КонецЦикла; |
|||
8
Nuobu
06.06.16
✎
13:56
|
||||
9
Волшебник
модератор
06.06.16
✎
14:13
|
(5) При этом затраты памяти могут оказаться бесконечными.
|
|||
10
Serg_1960
06.06.16
✎
14:18
|
(5) Для дерева рекурсия - то, что доктор прописал. Цикл, как замена рекурсии, только тогда, когда количество уровней известно и неизменно.
|
|||
11
mistеr
06.06.16
✎
14:19
|
(7) Уровни потерял. :)
(8) Да, обходит, но есть много памяти. В (6) я неявно подразумевал "без лишних затрат памяти". |
|||
12
Wern
06.06.16
✎
14:19
|
(9) Рекурсия тоже жрет память, только в стеке. С тем же успехом можно, завести массив, назвать его стэк и бегать по нему туда, сюда без всякой рекурсии, по памяти будет то же самое.
|
|||
13
mistеr
06.06.16
✎
14:20
|
(11) есть ->ест
|
|||
14
Wern
06.06.16
✎
14:20
|
(11) С чего бы это потерял, смотри внимательней, все там есть.
|
|||
15
Wern
06.06.16
✎
14:22
|
(11) без лишних затрат памяти смотри (12) сам алгоритм писать лень, но там ненамного сложнее чем в (7)
|
|||
16
Зая Бусечка
06.06.16
✎
14:23
|
(9) Это почему?
(10) ЛЮБУЮ рекурсию можно заменить циклом. |
|||
17
Serg_1960
06.06.16
✎
14:34
|
(16) Теоретически, да, возможно. Но на практике, зачастую, не имеет смысла излишнее усложнять алгоритм и сопровождение.
|
|||
18
Wern
06.06.16
✎
14:53
|
+(15) типо того: (памяти есть ровно столько же сколько обычная рекурсия).
мСтэк=Новый Массив; мСтэк.Добавить(Дерево); мСтэк.Добавить(0); Для Количество=1 По 100000 Цикл Позиция=мСтэк[мСтэк.Количество()-1]; УзелДерева=мСтэк[мСтэк.Количество()-2]; Если Позиция<УзелДерева.Строки.Количество() Тогда Сообщить(УзелДерева.Строки[Позиция].Имя); мСтэк[мСтэк.Количество()-1]=мСтэк[мСтэк.Количество()-1]+1; мСтэк.Добавить(УзелДерева.Строки[Позиция]); мСтэк.Добавить(0); Иначе мСтэк.Удалить(мСтэк.Количество()-1); мСтэк.Удалить(мСтэк.Количество()-1); КонецЕсли; Если мСтэк.Количество()=0 Тогда Прервать; КонецЕсли; КонецЦикла; |
|||
19
Волшебник
модератор
06.06.16
✎
14:54
|
(16) Любой цикл можно заменить рекурсией.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |