|
Обход дерева. Как это правильно решать? | ☑ | ||
---|---|---|---|---|
0
mnimo
05.12.14
✎
19:45
|
Есть некоторое ДеревоЗначений, одно из полей (колонок) которого - "Количество". «Листья» дерева заполнены значениями, «узлы» содержат 0 (количество звездочек обозначает глубину вложенности):
* 0 * * 0 * * * 10 * * * 5 * * * 10 * * 0 * * * 0 * * * * 7 Необходимо "обойти" дерево, записав в поле "Количество" узлов сумму полей "Количество" подчиненных записей, т.е. в итоге должно получиться: * 32 * * 25 * * * 10 * * * 5 * * * 10 * * 7 * * * 7 * * * * 7 Как будет решаться задача: 1. Если известно, что в дереве значений всего три уровня вложенности 2. Если количество уровней вложенности не ограничено. |
|||
1
iamnub
05.12.14
✎
19:50
|
Вообще в 1С принято такую инфу сразу из базы доставать. Запросом.
|
|||
2
iamnub
05.12.14
✎
19:51
|
Но и так можно. Ведь на самом низком уровне вложенности у тебя есть доступ к родительским строкам. Нашел значение - просуммировал его у всех родительских строк.
И всё. |
|||
3
МихаилМ
05.12.14
✎
19:55
|
2)рекурсия Вам в помощь.
|
|||
4
mnimo
05.12.14
✎
20:03
|
Надо начинать складывать с последнего уровня?
|
|||
5
exwill
05.12.14
✎
20:11
|
(0) Сначала реши для себя - как ты собираешься обходить дерево. С суммированием потом легко разберешься.
|
|||
6
Garykom
гуру
05.12.14
✎
20:18
|
Один раз изучить рекурсию и все
Тем более и повод есть |
|||
7
mnimo
05.12.14
✎
20:42
|
&НаКлиенте
Процедура Посчитать(Команда) ПосчитатьДерево(Дерево); КонецПроцедуры &НаКлиенте Процедура ПосчитатьДерево(Строки) ДеревоОбъект = Строки.ПолучитьЭлементы(); Сумма = 0; Для Каждого СтрокаДерева ИЗ ДеревоОбъект Цикл Если СтрокаДерева.Значение = 0 тогда ПосчитатьДерево(СтрокаДерева); Иначе Сумма = Сумма+СтрокаДерева.Значение; КонецЕсли; КонецЦикла; ДобавитьВРодителя(СтрокаДерева,Сумма); КонецПроцедуры &НаКлиенте Процедура ДобавитьВРодителя(СтрокаДерева,Сумма) СтрокаРодитель = СтрокаДерева.ПолучитьРодителя(); Если СтрокаРодитель<> Неопределено Тогда СтрокаРодитель.Количество = СтрокаРодитель.Количество + Сумма; ДобавитьВРодителя(СтрокаРодитель,Сумма); КонецЕсли; КонецПроцедуры |
|||
8
Drac0
05.12.14
✎
22:10
|
(7) Ну, и? Считает? Имхо, не должно.
|
|||
9
ramir
06.12.14
✎
01:33
|
Процедура Посчитать()
ВычислитьСуммуСтрок(Дерево); КонецПроцедуры Функция ВычислитьСуммуСтрок(Родитель) Сумма = 0; Для Каждого Стр Из Родитель.Строки Цикл Если Стр.Значение = 0 Тогда //А лучше проверять Стр.Строки.Количество() > 0 (не будем полагаться на Значение = 0) Стр.Значение = ВычислитьСуммуСтрок(Стр); КонецЕсли; Сумма = Сумма + Стр.Значение; КонецЦикла; Возврат Сумма; КонецФункции |
|||
10
Wobland
06.12.14
✎
03:12
|
эта контора называется "аванкор". решение давать?
|
|||
11
Escander
06.12.14
✎
05:23
|
(10) ты что-ли автор тестового задания?
|
|||
12
mdocs
06.12.14
✎
08:44
|
(0) было раньше. Красивого решения нет. Придется все равно городить тонну кода. Рекурсия разве что нижний уровень поможет найти.
|
|||
13
Wobland
06.12.14
✎
10:17
|
(11) контору в глаза не видел, но все семь заданий решал
|
|||
14
Wobland
06.12.14
✎
10:18
|
(13) даже в портфолио включил
|
|||
15
ifso
06.12.14
✎
10:53
|
(0) а в типовых обходы дерева не встречаются?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |