|
Подскажите по рекурсивной функции |
☑ |
0
егаис
16.05.22
✎
09:29
|
&НаСервере
Функция ВернутьДни(Знач ВыбПодразделение)
Если ВыбПодразделение.Родитель.Пустая() Тогда
Возврат ВыбПодразделение.Тест;
Иначе
Если ВыбПодразделение.Тест = 0 Тогда
ВернутьДни(ВыбПодразделение.Родитель);
Иначе
Возврат ВыбПодразделение.Тест; //значение
КонецЕсли;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура Команда1(Команда)
ВернутьДни(Подразделение);
КонецПроцедуры
Каким образом выскочить из рекурсии, если условие сработало на некоторой итерации?
Значение здесь получаем
Возврат ВыбПодразделение.Тест; //значение
но дальше возврат на предыдущий шаг, возвращает хрень.
|
|
1
егаис
16.05.22
✎
09:32
|
вешать какую-то переменную, типа ЗначениеВыбрано = Истина?
|
|
2
Chai Nic
16.05.22
✎
09:32
|
А опиши суть задачи. По предоставленному фрагменту ничего понять невозможно.
|
|
3
егаис
16.05.22
✎
09:33
|
(2) справочник подразделений в ЗУП. Есть числовое поле. Если оно заполнено у элемента, возвращаем его, если нет - у родителя
|
|
4
RomanYS
16.05.22
✎
09:34
|
(0) по сути вопроса выглядит нормально
&НаСервереБезКонтекста здесь напрашивается, но вопрос конечно не решит
|
|
5
Chai Nic
16.05.22
✎
09:35
|
(3) "Если оно заполнено у элемента, возвращаем его, если нет - у родителя"
И где здесь применение рекурсии? Подъем "снизу вверх" - чистейшая итерация.
|
|
6
егаис
16.05.22
✎
09:36
|
(5) иерархия может быть большой, предлагаешь все время на пустого родителя проверять?
|
|
7
Chai Nic
16.05.22
✎
09:38
|
(6) Как вам здесь рекурсия поможет? Если хотите оптимизацию при повторных вызовах - используйте кэширование.
|
|
8
Irbis
16.05.22
✎
09:38
|
(6) А уровень элемента запросить религия не позволяет?
|
|
9
егаис
16.05.22
✎
09:39
|
(8) рассматриваю и такой вариант, в цикле по уровню можно проверить
Почему рекурсия-то не подходит?
|
|
10
Irbis
16.05.22
✎
09:40
|
(9) Потому что тупая трата машинных ресурсов. Вместо иттерационного цикла с прерыванием в нужном месте.
|
|
11
егаис
16.05.22
✎
09:41
|
(10) уговорил, перепишем функцию )
|
|
12
Многолетний Апельсин
16.05.22
✎
09:43
|
Вместо
ВернутьДни(ВыбПодразделение.Родитель);
Написать
Возврат ВернутьДни(ВыбПодразделение.Родитель);
|
|
13
егаис
16.05.22
✎
09:46
|
(12) бинго! Спасибо!
|
|
14
Chai Nic
16.05.22
✎
09:51
|
Ещё и не так бывает, когда функции называть как процедуры.
|
|
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший