Имя: Пароль:
1C
1С v8
Как реализовать обход дерева значений с неизвестным количеством уровней
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) Любой цикл можно заменить рекурсией.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс