Рекурсия процедур и функций

В этой статья продолжим знакомиться с рекурсией. Разберем более интересный вид рекурсии: рекурсию процедур и функций. В предыдущей статье мы познакомились с рекурсией переменных.

И так, процедура или функция называются рекурсивными, когда они вызывают самих себя. Например, рекурсивная процедура будет выглядеть так:

Процедура прРекурсивная()
       //какой-то код
   прРекурсивная ();
КонецПроцедуры


А рекурсивная функция будет выглядеть следующим образом:

Функция  фРекурсивная(ПеремА,ПеремБ,…)
    //какой-то код
    фП = фРекурсивная(ПеремС,ПеремД,…);
    // какой-то код
КонецФункции

Есть явная рекурсия, которая показана в предыдущих примерах, а может быть неявная: когда процедура или функция будут вызывать процедуру или функцию, которые будут использовать первоначальную процедуру

Процедура прРекурсия()

ВызовРекурс();

КонецПроцедуры

Процедура ВызовРекурс()

прРекурсия();

КонецПроцедуры

Ещё важно помнить о таком не очень приятном событии, как бесконечная рекурсия

Есть разные способы борьбы с бесконечной рекурсией. Как вариант, передавать в рекурсивную процедуру или функцию счетчик, который при каждой рекурсии увеличиваем на 1. И в случае, когда счетчик достигает какого-нибудь значения, останавливаем рекурсию.


Процедура ВызовРекурсивнойФункции()

Счетчик = 0;

ПеремР = фРекурсивная(1,2,Счетчик);

КонецПроцедуры

Функция  фРекурсивная(ПеремА,ПеремБ,Счетчик)

Счетчик = Счетчик + 1;

Если Счетчик = 100 Тогда

Возврат Новый Структура(«ПеремА,ПеремБ»,ПеремА,ПеремБ);

КонецЕсли;

Возврат фРекурсивная(ПеремА +1,ПеремБ + 2,Счетчик);

КонецФункции

В этом примере, мы будем каждый раз входить в рекурсию и увеличивать счетчик, пока он не станет равен 100, после мы выйдем из нее.

Посмотрите, как отрабатывает наша рекурсивная функция

И рассмотрим один прикладной пример: узнаем с помощью рекурсивного вызова функции самую верхнюю группу какого-нибудь справочника. Пример я буду делать на демонстрационной конфигурации «Управляемое приложение 1С»


&НаСервереБезКонтекста
Функция ВернутьРодителя(Товар)

Если Товар.Уровень() = 0 Тогда
Возврат
Товар;
КонецЕсли;

Возврат ВернутьРодителя(Товар.Родитель);

КонецФункции

&НаСервере
Процедура УзнатьГлавногоРодителяНаСервере()

Если Товар.Уровень() = 0 Тогда
Сообщить(«Товар (группа) верхнего уровня»);
КонецЕсли;

ГлавныйРодитель = ВернутьРодителя(Товар);

Сообщить(ГлавныйРодитель);

КонецПроцедуры

&НаКлиенте
Процедура УзнатьГлавногоРодителя(Команда)

Если Не ЗначениеЗаполнено(Товар) Тогда
Сообщить(«ЗаполнитеТовар»);
Возврат;
КонецЕсли;

УзнатьГлавногоРодителяНаСервере();

КонецПроцедуры

В этом коде рекурсивной является функция ВернутьРодителя, в неё мы каждый раз передаем родителя номенклатуры, пока не достигнем самого верхнего уровня.

Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:

Книга «Программировать в 1С за 9 шагов»

Изучите программирование в 1С с помощью моей книги «Программировать в 1С за 9 шагов»

  1. Без сложных технических терминов.
  2. Более 500 страниц практического материала.
  3. Каждое задание сопровождается рисунком (скриншот).
  4. Сборник задач для домашней проработки.
  5. Книга написана понятным и простым языком — для новичка.
  6. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 16%: vCph8bW3rE

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *