Рекурсия некорректно работает

1. Tatyana_012345 24 19.01.24 11:54 Сейчас в теме
В моей практике рекурсию приходилось писать пару раз в жизни
Вопрос: написана рекурсия, при отладке на точке "Возврат БизнесПроцесс;" - обращение идет столько сколько было итераций в функции, а не единожды, подскажите пожалуйста что неверно написано



Функция ПолучитьГП(БизнесПроцесс) Экспорт
             
        Запрос = ...
        
        РезультатЗапроса    =  Запрос.Выполнить();
        
        Если не РезультатЗапроса.Пустой() Тогда
            
            Выборка    = Запрос.Выполнить().Выбрать();
            Выборка.Следующий();
            БизнесПроцесс = Выборка.ГП;    
            ПолучитьГП(БизнесПроцесс);
            
        КонецЕсли;          
        
        Возврат  БизнесПроцесс;

КонецФункции
Показать

И смущает этот код
БизнесПроцесс = Выборка.ГП;    
ПолучитьГП(БизнесПроцесс);

Без присвоения БизнесПроцесс = Выборка.ГП; возврат идет первоначального значения вызываемой функции
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 81 19.01.24 12:24 Сейчас в теме
(1)Рекурсия работает правильно, это вы не совсем понимаете происходящих процессов.

Если вы параметр функции используете в качестве выходного(ему присваиваете значение), то либо сделайте это процедурой, либо возвращайте другое значение.
user2033930; starik-2005; Sashares; Дмитрий74Чел; +4 Ответить
3. Tatyana_012345 24 19.01.24 12:48 Сейчас в теме
Функция ПолучитьГП(БизнесПроцесс) Экспорт

ГП=БизнесПроцесс;

Запрос = ...

РезультатЗапроса = Запрос.Выполнить();

Если не РезультатЗапроса.Пустой() Тогда

	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	ГП = ПолучитьГП(Выборка.ГП);
Иначе 
	Возврат ГП;
КонецЕсли;


КонецФункции
Показать


Вот так не работает
7. nomad_irk 81 19.01.24 13:47 Сейчас в теме
(3) Найдите отличия:
Функция ПолучитьГП(БизнесПроцесс) Экспорт

ВозвращаемоеЗначение = БизнесПроцессы.<МойБизнесПроцесс>.ПустаяСсылка();

Запрос = ...

РезультатЗапроса = Запрос.Выполнить();

Если не РезультатЗапроса.Пустой() Тогда

      Выборка = РезультатЗапроса.Выбрать();
      Выборка.Следующий();
      ВозвращаемоеЗначение = ПолучитьГП(Выборка.ГП);
КонецЕсли;

Возврат ВозвращаемоеЗначение;

КонецФункции;
Показать
4. starik-2005 3169 19.01.24 12:51 Сейчас в теме
Рекурсивная функция - это такая функция, которая имеет два блока: вызов себя с аргументом следующего уровня и возврат искомого значения. На примере того же фиббоначи:
функ фиб (парамтр) Если параметр = 1 тогда возврат 1 иначе возврат параметр + фиб(параметр - 1) конец

Вот и у вас должно быть что-то в этом духе. Типа
функ БП(Процесс) Если Процесс.Родитель = пустой Тогда возврат процесс иначе возврат БП(процесс.родитель) конец
user1880116; Tatyana_012345; +2 Ответить
6. user2033930 19.01.24 13:44 Сейчас в теме
(4) Ну можно и процедурой, а не функцией... Зависит от цели и от обрабатываемых данных.
5. user2033930 19.01.24 13:42 Сейчас в теме
И научитесь уже оформлять код. Тут для этого есть специальный тэг. За 15 лет можно было.
10. Tatyana_012345 24 19.01.24 13:56 Сейчас в теме
(5)
я тут редкий гость, но спасибо .. в след раз обращу на это внимание
8. user1880116 19.01.24 13:50 Сейчас в теме
Есть подозрение, что рекурсия тут вообще не нужна, и можно обойтись простым циклом пока.
9. пользователь 19.01.24 13:54
Сообщение было скрыто модератором.
...
11. пользователь 19.01.24 13:56
Сообщение было скрыто модератором.
...
12. пользователь 19.01.24 13:57
Сообщение было скрыто модератором.
...
13. пользователь 19.01.24 14:06
Сообщение было скрыто модератором.
...
14. пользователь 19.01.24 14:11
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот