В моей практике рекурсию приходилось писать пару раз в жизни
Вопрос: написана рекурсия, при отладке на точке "Возврат БизнесПроцесс;" - обращение идет столько сколько было итераций в функции, а не единожды, подскажите пожалуйста что неверно написано
И смущает этот код
Без присвоения БизнесПроцесс = Выборка.ГП; возврат идет первоначального значения вызываемой функции
Вопрос: написана рекурсия, при отладке на точке "Возврат БизнесПроцесс;" - обращение идет столько сколько было итераций в функции, а не единожды, подскажите пожалуйста что неверно написано
Функция ПолучитьГП(БизнесПроцесс) Экспорт
Запрос = ...
РезультатЗапроса = Запрос.Выполнить();
Если не РезультатЗапроса.Пустой() Тогда
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
БизнесПроцесс = Выборка.ГП;
ПолучитьГП(БизнесПроцесс);
КонецЕсли;
Возврат БизнесПроцесс;
КонецФункции
ПоказатьИ смущает этот код
БизнесПроцесс = Выборка.ГП;
ПолучитьГП(БизнесПроцесс);
Без присвоения БизнесПроцесс = Выборка.ГП; возврат идет первоначального значения вызываемой функции
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)Рекурсия работает правильно, это вы не совсем понимаете происходящих процессов.
Если вы параметр функции используете в качестве выходного(ему присваиваете значение), то либо сделайте это процедурой, либо возвращайте другое значение.
Если вы параметр функции используете в качестве выходного(ему присваиваете значение), то либо сделайте это процедурой, либо возвращайте другое значение.
Функция ПолучитьГП(БизнесПроцесс) Экспорт
ГП=БизнесПроцесс;
Запрос = ...
РезультатЗапроса = Запрос.Выполнить();
Если не РезультатЗапроса.Пустой() Тогда
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ГП = ПолучитьГП(Выборка.ГП);
Иначе
Возврат ГП;
КонецЕсли;
КонецФункции
ПоказатьВот так не работает
(3) Найдите отличия:
Функция ПолучитьГП(БизнесПроцесс) Экспорт
ВозвращаемоеЗначение = БизнесПроцессы.<МойБизнесПроцесс>.ПустаяСсылка();
Запрос = ...
РезультатЗапроса = Запрос.Выполнить();
Если не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ВозвращаемоеЗначение = ПолучитьГП(Выборка.ГП);
КонецЕсли;
Возврат ВозвращаемоеЗначение;
КонецФункции;
Показать
Рекурсивная функция - это такая функция, которая имеет два блока: вызов себя с аргументом следующего уровня и возврат искомого значения. На примере того же фиббоначи:
функ фиб (парамтр) Если параметр = 1 тогда возврат 1 иначе возврат параметр + фиб(параметр - 1) конец
Вот и у вас должно быть что-то в этом духе. Типа
функ БП(Процесс) Если Процесс.Родитель = пустой Тогда возврат процесс иначе возврат БП(процесс.родитель) конец
функ фиб (парамтр) Если параметр = 1 тогда возврат 1 иначе возврат параметр + фиб(параметр - 1) конец
Вот и у вас должно быть что-то в этом духе. Типа
функ БП(Процесс) Если Процесс.Родитель = пустой Тогда возврат процесс иначе возврат БП(процесс.родитель) конец
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот