# Урок 8. Рекурсия

**URL:** <https://forum.itvdn.com/t/urok-8-rekursiya/3178>\
**Category:** Справочник C# Starter\
**Created:** [08.02.2019 16:06:12 UTC](https://forum.itvdn.com/t/urok-8-rekursiya/3178 "2019-02-08T16:06:12Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![admin.guide](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/a/6a8cbe/32.png) [@admin.guide](https://forum.itvdn.com/u/admin.guide)\
**Post date:** [08.02.2019 16:06:12 UTC](https://forum.itvdn.com/t/urok-8-rekursiya/3178/1 "2019-02-08T16:06:12Z")

</div>

![6](https://forum.itvdn.com/uploads/default/original/1X/b85838da2a54494c528847e09c169d1b6756e397.jpeg)

Рекурсия – вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная рекурсия). Например, функция A вызывает функцию B, а функция B – функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.  
Одна из ключевых задач рекурсивного метода – предотвращение бесконечной рекурсии.

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

На каждый рекурсивный вызов требуется некоторое количество оперативной памяти, и при чрезмерно большой глубине рекурсии может наступить переполнение стека вызовов. Вследствие этого, обычно рекомендуется избегать рекурсивных программ, которые приводят (или в некоторых условиях могут приводить) к слишком большой глубине рекурсии.

Не используйте рекурсию для вычисления факториалов и чисел Фибоначчи.

Пример сложной рекурсии:

```
static void Recursion(int counter)
{
    counter--;

    Console.WriteLine("Первая половина метода Recursion: {0}", counter);

    if (counter != 0)
        Method(counter);

    Console.WriteLine("Вторая половина метода Recursion: {0}", counter);
}

static void Method(int counter)
{
    Console.WriteLine("Первая половина метода Method: {0}", counter);

    Recursion(counter);

    Console.WriteLine("Вторая половина метода Method: {0}", counter);
}

static void Main()
{
    Method(3);

    // Delay.
    Console.ReadKey();
}

```

![7](https://forum.itvdn.com/uploads/default/original/1X/df9183af8630d73807b6bace4166382bb2e5e4c5.jpeg)

В данном примере метод `Recursion` вызывает метод `Method`, который внутри себя вызывает метод `Recursion`, таким образом, метод `Recursion` будет вызываться рекурсивно.

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

Источник: видеоурок Александра Шевчука ["МЕТОДЫ. РЕКУРСИЯ"](https://itvdn.com/ru/video/csharp-starter/recursion?position=3650)

[![%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BB%D0%B5%D0%B2%D0%BE%202](https://forum.itvdn.com/uploads/default/original/1X/b38ed3846d27463ae91c4449efd4de36bbb0b1b1.jpeg) предыдущая статья](https://forum.itvdn.com/t/urok-8-vyzov-metodom-drugogo-metoda/3179) | [следующая статья ![%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%202](https://forum.itvdn.com/uploads/default/original/1X/6188b82e0808cd73a15f53f8e652f939106184bc.jpeg)](https://forum.itvdn.com/t/urok-8-primery-ispolzovaniya-rekursii/3177)

---

<div class="post-metadata">

**Author:** ![UluMulu](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/u/f17d59/32.png) [@UluMulu](https://forum.itvdn.com/u/UluMulu)\
**Post date:** [04.02.2021 19:16:32 UTC](https://forum.itvdn.com/t/urok-8-rekursiya/3178/2 "2021-02-04T19:16:32Z")

</div>

Подскажите, а что подразумевается под "копия метода" при рекурсии? То, что на каждый вызов метода в стек будет попадать новый фрейм, и, при определенных условиях может произойти StackOverflow ошибка, или что-то другое?
