Современный мир беспрестанно развивается. Раньше многие понятия были сокрыты от людей, считались непонятными. Так появилось программирование с собственными алгоритмами. Специально обученные люди пользуются некими «машинными языками», чтобы создавать программы и игры, «общаться» с компьютерами и другими устройствами.
Но некоторые термины у программеров появились, благодаря точным наукам – физике, математике и так далее. Существуют так называемые рекурсивные алгоритмы, без которых продвинутому разработчику/программисту придется туго. В данной статье будет рассказано о том, что соответствующий термин значит, как используется на практике в «машинном языке».
Программирование – определение
Но перед определением упомянутого термина требуется разобраться с другими важными понятиями. Что такое программирование, о котором тоже зайдет речь, понимает далеко не каждый.
Так описывают процедуру создания компьютерных программ, игр, приложений. Основывается на применении определенного синтаксиса. А именно – языка программирования.
Сейчас есть программирование как на мобильных, так и на компьютерных платформах. Люди, занимающиеся написанием кодов программ, называются программистами.
Язык программирования
Язык программирования – некий сборник формальных правил, согласно которым пишутся всевозможные программы. Требуется для того, чтобы пользователь/программер мог «общаться» с компьютерами и другими устройствами.
Языков существует огромное множество. Каждый обладает собственным синтаксисом, функциями, операторами, посредством которых составляются выражения. Условно разделяются на:
- объектно-ориентированные;
- декларативные.
Первые просты в освоении, так как используют в процессе создания приложения независимые объекты и их группы. Декларативные языки предусматривает установление связи между информационными первоначальными структурами, а также конечным результатом.
Рекурсивные функции присутствуют в каждом языке. Если разобраться с ними, получится быстро производить различные расчеты через компьютеры, а также составлять расчетные приложения.
Рекурсия – что это такое
Рекурсией называется некое свойство объекта или вещи, позволяющее заниматься подражанием самому себе. Предмет рекурсивный, если его части обладают такой же «внешностью», как и весь он целиком. Имеет широкое распространение в математике, физике, написании машинных кодов.
В случае с компьютерами упомянутым свойством обладают преимущественно функции. Они также зовутся методами.
Рекурсией при подобных обстоятельствах называют способ определения функций, при котором результат возврата для соответствующего аргумента определится на основе результатов возврата из этой же функции для предыдущего (того, что больше или меньше) значения аргумента.
Когда метод вызывает себя самостоятельно, он носит название «рекурсивный алгоритм» или «вызов». Каждый раз будут запоминаться прошлые значения внутренних локальных переменных, а также полученных в результате расчетов параметров функций.
Для того, чтобы каждый шаг рекурсивного вызова отличался от прошлого, корректируются параметры функции. Минимум – один из них. Останавливается процесс соответствующих алгоритмов тогда, когда корректируемые значения достигают некоторого «лимита». Пример – обработка последнего массивного элемента.
Выражение в компьютерах
Программеры сталкиваются с рекурсивными алгоритмами в структурах данных:
- Графы. Эти объекты рассматривают в качестве совокупности отдельных узлов и подграфов (наименьших из имеющихся).
- Строки, состоящие из первого символа и подстроки. А именно – самой маленькой строчки.
Также рассматриваемое понятие встречается в шаблонах проектирования. Пример – декораторы. Его объекты могут включать в себя другие составляющие, которые тоже выступают в качестве декораторов. А еще в виде функций. Последний вариант является самым распространенным. Особенно при написании машинных кодов.
Основным правилом операции служит следующий принцип: до рекурсивного вызова обязательно должна стоять проверка на возврат.
Важные термины
Для лучшего понимания темы необходимо уяснить следующие понятия:
- Рекурсивный порядок действий – тот, в определении которого имеется прямой/косвенный вызов того же метода.
- Рекурсивная функция – математическое уточнения интуитивного понятия рассматриваемого выражения.
- Адаптивный рекурсивный алгоритм – порядок действий, при которых благодаря рекурсивности во внимание принимаются индивидуальные черты решаемой задачи из области своего определения.
- Базис – предположение, которое определяет начальные обстоятельства или «картину» происходящего в момент завершения. Здесь описывается элементарный случай, при котором удается сразу получить ответ.
- Шаг – принцип, тело которого содержит в качестве подцели вызов определяемого предиката.
- Подпрограммы – все то, что располагается внутри рекурсивных операций.
Теперь можно подумать, какие у рекурсии имеются разновидности. Их не так много, но каждый вариант развития событий предусматривает собственные нюансы.
Стратегия
Но для начала стоит рассмотреть так называемый рекурсивную стратегию. Это – общий случай, согласно которому происходит реализация поставленной задачи. Состоит из нескольких шагов:
- упорядочивание информации;
- решение меньшей части проблемы;
- поиск и реализация решения большей части поставленной задачи.
Для лучшего понимания стоит рассмотреть наглядный пример, но о нем позже. Ведь рекурсия и ее методы бывают разными. И каждый предусматривает какие-то свои нюансы.
Разновидности рекурсии
Рекурсивные методы классифицируются по-разному: по своей сложности или «хвостовой части». Поэтому условно разделить соответствующий элемент можно на несколько крупных категорий.
Простая
Это – функция, которая содержит вызов иных операций и методов. Способна вызывать себя самостоятельно. Никаких парадоксов. Компьютер будет последовательно выполнять команды, а если встретится вызов процедуры, займется ей.
Procedure Rec(int n);
Begin
If n>0 then;
Rec(n-1);
Writeln(n);
End;
Предложенный код – пример простой рекурсии. Но есть и другие варианты развития событий. Решения задачи иногда требуют более «запутанных» алгоритмов.
Сложная
Данном случае одна функция вызывает другую. Вторая ответно занимается вызовом первой. При подобных обстоятельствах первая операция должна вызывать ту, что еще не описана. Для того, чтобы справиться с поставленной задачей, используются так называемые опережающие описания.
Procedure A(int i); //заголовок первой операции – опережающее описание
Procedure B(int i); //опережающая «характеристика» второго действия
Procedure A(int i); //полное описание основной операции A
Begin
Writeln(i);
B(i-1);
End;
Procedure B(int i); //полное описание основной операции B
Begin
Writeln(i);
If i<10 then
A(i+2);
End;
Если попытаться представить наглядно предложенные рекурсивные функции, то простой вариант – это уроборос. Сложный – детский стишок, в котором «волки с перепуга, скушали друг друга». Достаточно наглядно представить этот процесс и двух волков, чтобы понять, о чем речь.
Хвостовая
Хвостовой рекурсия будет, если соответствующий вызов окажется последним действием функции перед тем, как произойдет возврат результата. То есть, окажется в «хвосте» описываемого алгоритма:
Def fact_tailrec(n, result 1);
If n=0;
Return result 1
Else
Return fact_tailtec(n-1, result*n)
Этот код актуален для факториала.
Не обязательно метод хвостового типа будет также считаться рекурсивным. Он способен вызывать иные функции, осуществлять взаимную рекурсию или иные, более сложные схемы. Каноничный пример взаимной рекурсии:
Тут вызовы функций располагаются в «хвосте». Более простым примером обойтись нельзя. Связано это с тем, что представленные коды используют только один вызов в каждой операции. Кодификация усложняется, когда необходимо осуществлять множественные обращения. Пример – вычисление числа Фибоначчи.
Не хвостовая
Если же вызовы не являются последними в задействованной функции, она называется не хвостовой. Таких примеров очень много. Все, что не относится к хвостовому виду.
Классификация по записи
Рекурсивная функция может вызывать сама себя. Из-за этого приходится повторно выполнять имеющиеся в ней указания. Происходит операция, подобная работе цикла. Записываться такой элемент может разными методами:
- Префиксным способом. Сначала происходит рекурсивный вызов, только потом – необходимые действия.
- 2. Постфиксной записью. При подобных обстоятельствах на первый план выходят те или иные алгоритмы/манипуляции. Лишь после программист должен сделать вызов рекурсивной функции.
Стоит обратить внимание на некоторые «частные» случаи. Они помогают заменить рассматриваемые типы записей на более простые.
Итерирование
Отдельный вид рекурсии – когда в его основе находятся рекуррентные соотношения. Они имеют вид:
Здесь каждый элемент последовательности выражается через p предыдущих членов. Для того, чтобы получить тот или иной результат, потребуется повторение обновления значений этой самой последовательности. Соответствующее действие называют итерацией, а сам процесс «воспроизведения» — итерирование.
Итерация – осуществление обработки информации, при которой предпринимаемые манипуляции повторяются много раз. Вызов элементов массива (то есть, самих себя) в описываемом случае не осуществляется. В рекурсии – да.
При вызове функций осуществляется некоторое количество допрасходов, связанных с передачей управления и аргументов, возврата вычисленных значений. Итерационная операция в случае с факториалом (пример выше) окажется быстрее recursion. Итерация c рекурсией не всегда совместимы.
Внимание: если в основе рекурсивной операции лежит единственное условие «вызвать саму себя», ее удастся с легкостью заменить итерационным циклом.
Алгоритмы рекурсии – анализ
Когда происходит анализ циклических функций, осуществляется расчет трудоемкости итераций и их численность в самом плохом, хорошем и среднем случае. Но с рекурсией подобный расклад не работает. Связано это с тем, что в конечном итоге получится рекуррентное соотношение. По ним сложность оценить невозможно.
Поэтому на практике используются различные способы реализации поставленной задачи:
- Подстановка (метод итераций). Последовательно заменяются рекуррентные части в выражениях для того, чтобы получить новые. Операция не прекращается до тех пор, пока не будет понят общий принцип, а также пользователь не сможет переписать его нереккурентной формулой. В примере ниже выведена формула, но первый шаг – это предположение. Нет никаких доказательств соответствия операции рекуррентному выражению.
- 2. Математическая индукция. Доказывает истинность некоторого утверждения, состоящего из двух шагов. Первый – это доказательства утверждения для частных случаев (одного или нескольких). Второй – из истинности основополагающего утверждения (индуктивной гипотезы) и частных случаев выводят подтверждение последующих шагов.
- 3. Общий. В нем каждое условие для случая в формуле доказано формально. Требуется определить случай основной теоремы, согласно которому обнаружится соответствие рекуррентного соотношения.
Но приведенные примеры преимущественно встречаются в теории. В реальной жизни они не имеют места. Для лучшего понимания рекурсии стоит изучить наглядный практический пример. Он пригодится каждому пользователю.
Пример из практики
Решения рекурсивного характера – условие, которое не так трудно обнаружить на практике. Но жизненные примеры весьма проблематично представить такими, чтобы их можно было изобразить итеративным способом.
Это – наглядный образец сортировки посредством слияния. Используемый язык программирования – Python. Чем-то напоминает обратный ход дерева – сначала требуется пойти рекурсивно влево, после – вправо, далее – скомбинировать полученные результаты. Подобные вариации в «обычный» код перерабатываются с трудом. Но в практике применяются достаточно часто.
Сортировка посредством слияния – множественная рекурсия, которая была рассмотрена равным образом как с числом Фибоначчи.
Теперь основные моменты, связанные с рекурсией в программировании, понятны. Более углубленное изучение темы основывается на составлении различных примеров непосредственно на языках программирования.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Программирование и рекурсия OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Современный мир беспрестанно развивается. Раньше многие понятия были сокрыты от людей, считались непонятными. Так появилось программирование с собственными алгоритмами. Специально обученные люди пользуются некими «машинными языками», чтобы создавать программы и игры, «общаться» с компьютерами и другими устройствами. Но некоторые термины у программеров появились, благодаря точным наукам – физике, математике и так далее. Существуют так называемые" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/programmirovanie-i-rekursiya/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#article","name":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f OTUS","headline":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2021\/08\/oj-1080x720-12.png","width":1080,"height":720},"datePublished":"2021-08-13T20:10:30+00:00","dateModified":"2021-08-13T20:12:11+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#listItem","position":2,"name":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#webpage","url":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/","name":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f OTUS","description":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u0440 \u0431\u0435\u0441\u043f\u0440\u0435\u0441\u0442\u0430\u043d\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0431\u044b\u043b\u0438 \u0441\u043e\u043a\u0440\u044b\u0442\u044b \u043e\u0442 \u043b\u044e\u0434\u0435\u0439, \u0441\u0447\u0438\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438. \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u043c\u0438 \u00ab\u043c\u0430\u0448\u0438\u043d\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438\u00bb, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0438\u0433\u0440\u044b, \u00ab\u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f\u00bb \u0441 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u041d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u0447\u043d\u044b\u043c \u043d\u0430\u0443\u043a\u0430\u043c \u2013 \u0444\u0438\u0437\u0438\u043a\u0435, \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2021\/08\/oj-1080x720-12.png","@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#mainImage","width":1080,"height":720},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/programmirovanie-i-rekursiya\/#mainImage"},"datePublished":"2021-08-13T20:10:30+00:00","dateModified":"2021-08-13T20:12:11+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/1757" /><link rel='shortlink' href='https://otus.ru/journal/?p=1757' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fprogrammirovanie-i-rekursiya%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fprogrammirovanie-i-rekursiya%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-1757 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-1757" class="the-post post-1757 post type-post status-publish format-standard has-post-thumbnail category-polza tag-programmirovanie">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Программирование и рекурсия
</h1>
<a href="https://otus.ru/journal/programmirovanie-i-rekursiya/" class="date-link" data-wpel-link="internal"><time class="post-date">13 августа, 2021</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12.png" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Программирование и рекурсия" title="Программирование и рекурсия" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12-270x180.png 270w" data-src="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-12-770x515.png" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%E2%80%93_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Программирование – определение">Программирование – определение</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Язык программирования">Язык программирования</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F_%E2%80%93_%D1%87%D1%82%D0%BE_%D1%8D%D1%82%D0%BE_%D1%82%D0%B0%D0%BA%D0%BE%D0%B5" title="Рекурсия – что это такое">Рекурсия – что это такое</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%92%D0%B0%D0%B6%D0%BD%D1%8B%D0%B5_%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D1%8B" title="Важные термины">Важные термины</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F" title="Стратегия">Стратегия</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%A0%D0%B0%D0%B7%D0%BD%D0%BE%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8" title="Разновидности рекурсии">Разновидности рекурсии</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B0%D1%8F" title="Простая">Простая</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%A1%D0%BB%D0%BE%D0%B6%D0%BD%D0%B0%D1%8F" title="Сложная">Сложная</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F" title="Хвостовая">Хвостовая</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%9D%D0%B5_%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F" title="Не хвостовая">Не хвостовая</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8" title="Классификация по записи">Классификация по записи</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%98%D1%82%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Итерирование">Итерирование</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8_%E2%80%93_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7" title="Алгоритмы рекурсии – анализ">Алгоритмы рекурсии – анализ</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%B8%D0%B7_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8" title="Пример из практики">Пример из практики</a></li></ul></nav></div>
<p>Современный мир беспрестанно развивается. Раньше многие понятия были сокрыты от людей, считались непонятными. Так появилось программирование с собственными алгоритмами. Специально обученные люди пользуются некими «машинными языками», чтобы создавать программы и игры, «общаться» с компьютерами и другими устройствами.</p>
<p>Но некоторые термины у программеров появились, благодаря точным наукам – физике, математике и так далее. Существуют так называемые рекурсивные алгоритмы, без которых продвинутому разработчику/программисту придется туго. В данной статье будет рассказано о том, что соответствующий термин значит, как используется на практике в «машинном языке».</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%E2%80%93_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Программирование – определение<span class="ez-toc-section-end"></span></h2>
<p>Но перед определением упомянутого термина требуется разобраться с другими важными понятиями. Что такое программирование, о котором тоже зайдет речь, понимает далеко не каждый.</p>
<p>Так описывают процедуру создания компьютерных программ, игр, приложений. Основывается на применении определенного синтаксиса. А именно – языка программирования.</p>
<p>Сейчас есть программирование как на мобильных, так и на компьютерных платформах. Люди, занимающиеся написанием кодов программ, называются программистами.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></span>Язык программирования<span class="ez-toc-section-end"></span></h3>
<p>Язык программирования – некий сборник формальных правил, согласно которым пишутся всевозможные программы. Требуется для того, чтобы пользователь/программер мог «общаться» с компьютерами и другими устройствами.</p>
<p>Языков существует огромное множество. Каждый обладает собственным синтаксисом, функциями, операторами, посредством которых составляются выражения. Условно разделяются на:</p>
<ul><li>объектно-ориентированные;</li><li>декларативные.</li></ul>
<p>Первые просты в освоении, так как используют в процессе создания приложения независимые объекты и их группы. Декларативные языки предусматривает установление связи между информационными первоначальными структурами, а также конечным результатом.</p>
<p>Рекурсивные функции присутствуют в каждом языке. Если разобраться с ними, получится быстро производить различные расчеты через компьютеры, а также составлять расчетные приложения.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F_%E2%80%93_%D1%87%D1%82%D0%BE_%D1%8D%D1%82%D0%BE_%D1%82%D0%B0%D0%BA%D0%BE%D0%B5"></span>Рекурсия – что это такое<span class="ez-toc-section-end"></span></h2>
<p>Рекурсией называется некое свойство объекта или вещи, позволяющее заниматься подражанием самому себе. Предмет рекурсивный, если его части обладают такой же «внешностью», как и весь он целиком. Имеет широкое распространение в математике, физике, написании машинных кодов.</p>
<p>В случае с компьютерами упомянутым свойством обладают преимущественно функции. Они также зовутся методами.</p>
<p>Рекурсией при подобных обстоятельствах называют способ определения функций, при котором результат возврата для соответствующего аргумента определится на основе результатов возврата из этой же функции для предыдущего (того, что больше или меньше) значения аргумента.</p>
<p>Когда метод вызывает себя самостоятельно, он носит название «рекурсивный алгоритм» или «вызов». Каждый раз будут запоминаться прошлые значения внутренних локальных переменных, а также полученных в результате расчетов параметров функций.</p>
<p>Для того, чтобы каждый шаг рекурсивного вызова отличался от прошлого, корректируются параметры функции. Минимум – один из них. Останавливается процесс соответствующих алгоритмов тогда, когда корректируемые значения достигают некоторого «лимита». Пример – обработка последнего массивного элемента.</p>
<p>Выражение в компьютерах</p>
<p>Программеры сталкиваются с рекурсивными алгоритмами в структурах данных:</p>
<ol type="1"><li>Графы. Эти объекты рассматривают в качестве совокупности отдельных узлов и подграфов (наименьших из имеющихся).</li><li>Строки, состоящие из первого символа и подстроки. А именно – самой маленькой строчки.</li></ol>
<p>Также рассматриваемое понятие встречается в шаблонах проектирования. Пример – декораторы. Его объекты могут включать в себя другие составляющие, которые тоже выступают в качестве декораторов. А еще в виде функций. Последний вариант является самым распространенным. Особенно при написании машинных кодов.</p>
<p>Основным правилом операции служит следующий принцип: до рекурсивного вызова обязательно должна стоять проверка на возврат.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D0%B0%D0%B6%D0%BD%D1%8B%D0%B5_%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D1%8B"></span>Важные термины<span class="ez-toc-section-end"></span></h3>
<p>Для лучшего понимания темы необходимо уяснить следующие понятия:</p>
<ol type="1"><li>Рекурсивный порядок действий – тот, в определении которого имеется прямой/косвенный вызов того же метода.</li><li>Рекурсивная функция – математическое уточнения интуитивного понятия рассматриваемого выражения.</li><li>Адаптивный рекурсивный алгоритм – порядок действий, при которых благодаря рекурсивности во внимание принимаются индивидуальные черты решаемой задачи из области своего определения.</li><li>Базис – предположение, которое определяет начальные обстоятельства или «картину» происходящего в момент завершения. Здесь описывается элементарный случай, при котором удается сразу получить ответ.</li><li>Шаг – принцип, тело которого содержит в качестве подцели вызов определяемого предиката.</li><li>Подпрограммы – все то, что располагается внутри рекурсивных операций.</li></ol>
<p>Теперь можно подумать, какие у рекурсии имеются разновидности. Их не так много, но каждый вариант развития событий предусматривает собственные нюансы.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F"></span>Стратегия<span class="ez-toc-section-end"></span></h2>
<p>Но для начала стоит рассмотреть так называемый рекурсивную стратегию. Это – общий случай, согласно которому происходит реализация поставленной задачи. Состоит из нескольких шагов:</p>
<ul><li>упорядочивание информации;</li><li>решение меньшей части проблемы;</li><li>поиск и реализация решения большей части поставленной задачи.</li></ul>
<p>Для лучшего понимания стоит рассмотреть наглядный пример, но о нем позже. Ведь рекурсия и ее методы бывают разными. И каждый предусматривает какие-то свои нюансы.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B7%D0%BD%D0%BE%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8"></span>Разновидности рекурсии<span class="ez-toc-section-end"></span></h2>
<p>Рекурсивные методы классифицируются по-разному: по своей сложности или «хвостовой части». Поэтому условно разделить соответствующий элемент можно на несколько крупных категорий.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%B0%D1%8F"></span>Простая<span class="ez-toc-section-end"></span></h3>
<p>Это – функция, которая содержит вызов иных операций и методов. Способна вызывать себя самостоятельно. Никаких парадоксов. Компьютер будет последовательно выполнять команды, а если встретится вызов процедуры, займется ей.</p>
<pre class="wp-block-code"><code>Procedure Rec(int n);
Begin
If n>0 then;
Rec(n-1);
Writeln(n);
End;</code></pre>
<p>Предложенный код – пример простой рекурсии. Но есть и другие варианты развития событий. Решения задачи иногда требуют более «запутанных» алгоритмов.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BB%D0%BE%D0%B6%D0%BD%D0%B0%D1%8F"></span>Сложная<span class="ez-toc-section-end"></span></h3>
<p>Данном случае одна функция вызывает другую. Вторая ответно занимается вызовом первой. При подобных обстоятельствах первая операция должна вызывать ту, что еще не описана. Для того, чтобы справиться с поставленной задачей, используются так называемые опережающие описания.</p>
<pre class="wp-block-code"><code>Procedure A(int i); //заголовок первой операции – опережающее описание
Procedure B(int i); //опережающая «характеристика» второго действия
Procedure A(int i); //полное описание основной операции A
Begin
Writeln(i);
B(i-1);
End;
Procedure B(int i); //полное описание основной операции B
Begin
Writeln(i);
If i<10 then
A(i+2);
End;</code></pre>
<p>Если попытаться представить наглядно предложенные рекурсивные функции, то простой вариант – это уроборос. Сложный – детский стишок, в котором «волки с перепуга, скушали друг друга». Достаточно наглядно представить этот процесс и двух волков, чтобы понять, о чем речь.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A5%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F"></span>Хвостовая<span class="ez-toc-section-end"></span></h3>
<p>Хвостовой рекурсия будет, если соответствующий вызов окажется последним действием функции перед тем, как произойдет возврат результата. То есть, окажется в «хвосте» описываемого алгоритма:</p>
<pre class="wp-block-code"><code>Def fact_tailrec(n, result 1);
If n=0;
Return result 1
Else
Return fact_tailtec(n-1, result*n)</code></pre>
<p>Этот код актуален для факториала.</p>
<p>Не обязательно метод хвостового типа будет также считаться рекурсивным. Он способен вызывать иные функции, осуществлять взаимную рекурсию или иные, более сложные схемы. Каноничный пример взаимной рекурсии:</p>
<figure class="wp-block-image size-large"><img decoding="async" width="860" height="240" src="https://otus.ru/journal/wp-content/uploads/2021/08/1-3.jpg" alt="Программирование и рекурсия" class="wp-image-1759" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/1-3.jpg 860w, https://otus.ru/journal/wp-content/uploads/2021/08/1-3-300x84.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/1-3-150x42.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/08/1-3-768x214.jpg 768w" sizes="(max-width: 860px) 100vw, 860px" /></figure>
<p>Тут вызовы функций располагаются в «хвосте». Более простым примером обойтись нельзя. Связано это с тем, что представленные коды используют только один вызов в каждой операции. Кодификация усложняется, когда необходимо осуществлять множественные обращения. Пример – вычисление числа Фибоначчи.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B5_%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%B0%D1%8F"></span>Не хвостовая<span class="ez-toc-section-end"></span></h3>
<p>Если же вызовы не являются последними в задействованной функции, она называется не хвостовой. Таких примеров очень много. Все, что не относится к хвостовому виду.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8"></span>Классификация по записи<span class="ez-toc-section-end"></span></h3>
<p>Рекурсивная функция может вызывать сама себя. Из-за этого приходится повторно выполнять имеющиеся в ней указания. Происходит операция, подобная работе цикла. Записываться такой элемент может разными методами:</p>
<ol type="1"><li>Префиксным способом. Сначала происходит рекурсивный вызов, только потом – необходимые действия.</li></ol>
<figure class="wp-block-image size-large"><img decoding="async" width="421" height="367" src="https://otus.ru/journal/wp-content/uploads/2021/08/2-2.jpg" alt="Программирование и рекурсия" class="wp-image-1760" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/2-2.jpg 421w, https://otus.ru/journal/wp-content/uploads/2021/08/2-2-300x262.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/2-2-150x131.jpg 150w" sizes="(max-width: 421px) 100vw, 421px" /></figure>
<ul><li>2. Постфиксной записью. При подобных обстоятельствах на первый план выходят те или иные алгоритмы/манипуляции. Лишь после программист должен сделать вызов рекурсивной функции.</li></ul>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="415" height="365" src="https://otus.ru/journal/wp-content/uploads/2021/08/3-2.jpg" alt="Программирование и рекурсия" class="wp-image-1761" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/3-2.jpg 415w, https://otus.ru/journal/wp-content/uploads/2021/08/3-2-300x264.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/3-2-150x132.jpg 150w" sizes="(max-width: 415px) 100vw, 415px" /></figure>
<p>Стоит обратить внимание на некоторые «частные» случаи. Они помогают заменить рассматриваемые типы записей на более простые.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%82%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"></span>Итерирование<span class="ez-toc-section-end"></span></h3>
<p>Отдельный вид рекурсии – когда в его основе находятся рекуррентные соотношения. Они имеют вид:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="889" height="72" src="https://otus.ru/journal/wp-content/uploads/2021/08/4-2.jpg" alt="Программирование и рекурсия" class="wp-image-1762" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/4-2.jpg 889w, https://otus.ru/journal/wp-content/uploads/2021/08/4-2-300x24.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/4-2-150x12.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/08/4-2-768x62.jpg 768w" sizes="(max-width: 889px) 100vw, 889px" /></figure>
<p>Здесь каждый элемент последовательности выражается через p предыдущих членов. Для того, чтобы получить тот или иной результат, потребуется повторение обновления значений этой самой последовательности. Соответствующее действие называют итерацией, а сам процесс «воспроизведения» — итерирование.</p>
<p>Итерация – осуществление обработки информации, при которой предпринимаемые манипуляции повторяются много раз. Вызов элементов массива (то есть, самих себя) в описываемом случае не осуществляется. В рекурсии – да.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="892" height="411" src="https://otus.ru/journal/wp-content/uploads/2021/08/5-2.jpg" alt="Программирование и рекурсия" class="wp-image-1763" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/5-2.jpg 892w, https://otus.ru/journal/wp-content/uploads/2021/08/5-2-300x138.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/5-2-150x69.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/08/5-2-768x354.jpg 768w" sizes="(max-width: 892px) 100vw, 892px" /></figure>
<p>При вызове функций осуществляется некоторое количество допрасходов, связанных с передачей управления и аргументов, возврата вычисленных значений. Итерационная операция в случае с факториалом (пример выше) окажется быстрее recursion. Итерация c рекурсией не всегда совместимы.</p>
<p>Внимание: если в основе рекурсивной операции лежит единственное условие «вызвать саму себя», ее удастся с легкостью заменить итерационным циклом.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B8_%E2%80%93_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7"></span>Алгоритмы рекурсии – анализ<span class="ez-toc-section-end"></span></h2>
<p>Когда происходит анализ циклических функций, осуществляется расчет трудоемкости итераций и их численность в самом плохом, хорошем и среднем случае. Но с рекурсией подобный расклад не работает. Связано это с тем, что в конечном итоге получится рекуррентное соотношение. По ним сложность оценить невозможно.</p>
<p>Поэтому на практике используются различные способы реализации поставленной задачи:</p>
<ol type="1"><li>Подстановка (метод итераций). Последовательно заменяются рекуррентные части в выражениях для того, чтобы получить новые. Операция не прекращается до тех пор, пока не будет понят общий принцип, а также пользователь не сможет переписать его нереккурентной формулой. В примере ниже выведена формула, но первый шаг – это предположение. Нет никаких доказательств соответствия операции рекуррентному выражению.</li></ol>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="848" height="110" src="https://otus.ru/journal/wp-content/uploads/2021/08/6-2.jpg" alt="Программирование и рекурсия" class="wp-image-1764" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/6-2.jpg 848w, https://otus.ru/journal/wp-content/uploads/2021/08/6-2-300x39.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/6-2-150x19.jpg 150w, https://otus.ru/journal/wp-content/uploads/2021/08/6-2-768x100.jpg 768w" sizes="(max-width: 848px) 100vw, 848px" /></figure>
<ul><li>2. Математическая индукция. Доказывает истинность некоторого утверждения, состоящего из двух шагов. Первый – это доказательства утверждения для частных случаев (одного или нескольких). Второй – из истинности основополагающего утверждения (индуктивной гипотезы) и частных случаев выводят подтверждение последующих шагов.</li><li>3. Общий. В нем каждое условие для случая в формуле доказано формально. Требуется определить случай основной теоремы, согласно которому обнаружится соответствие рекуррентного соотношения.</li></ul>
<p>Но приведенные примеры преимущественно встречаются в теории. В реальной жизни они не имеют места. Для лучшего понимания рекурсии стоит изучить наглядный практический пример. Он пригодится каждому пользователю.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D0%B8%D0%B7_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8"></span>Пример из практики<span class="ez-toc-section-end"></span></h2>
<p>Решения рекурсивного характера – условие, которое не так трудно обнаружить на практике. Но жизненные примеры весьма проблематично представить такими, чтобы их можно было изобразить итеративным способом.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="584" height="338" src="https://otus.ru/journal/wp-content/uploads/2021/08/7-1.jpg" alt="Программирование и рекурсия" class="wp-image-1765" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/7-1.jpg 584w, https://otus.ru/journal/wp-content/uploads/2021/08/7-1-300x174.jpg 300w, https://otus.ru/journal/wp-content/uploads/2021/08/7-1-150x87.jpg 150w" sizes="(max-width: 584px) 100vw, 584px" /></figure>
<p>Это – наглядный образец сортировки посредством слияния. Используемый язык программирования – Python. Чем-то напоминает обратный ход дерева – сначала требуется пойти рекурсивно влево, после – вправо, далее – скомбинировать полученные результаты. Подобные вариации в «обычный» код перерабатываются с трудом. Но в практике применяются достаточно часто.</p>
<p>Сортировка посредством слияния – множественная рекурсия, которая была рассмотрена равным образом как с числом Фибоначчи.</p>
<p>Теперь основные моменты, связанные с рекурсией в программировании, понятны. Более углубленное изучение темы основывается на составлении различных примеров непосредственно на языках программирования.</p>
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a href="https://otus.ru/?utm_source=oj" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Otus<span class="wpel-icon wpel-image wpel-icon-6"></span></a>!</em></p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/lessons/algorithm/?utm_source=oj&utm_medium=affilate&utm_campaign=algo" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="970" height="90" src="https://otus.ru/journal/wp-content/uploads/2021/08/Algoritmy_970x90-20219-543a9a.png" alt="Программирование и рекурсия" class="wp-image-1767" srcset="https://otus.ru/journal/wp-content/uploads/2021/08/Algoritmy_970x90-20219-543a9a.png 970w, https://otus.ru/journal/wp-content/uploads/2021/08/Algoritmy_970x90-20219-543a9a-300x28.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/Algoritmy_970x90-20219-543a9a-150x14.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/Algoritmy_970x90-20219-543a9a-768x71.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>
<p></p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/programmirovanie/" rel="tag" data-wpel-link="internal">программирование</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fprogrammirovanie-i-rekursiya%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fprogrammirovanie-i-rekursiya%2F&text=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fprogrammirovanie-i-rekursiya%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fprogrammirovanie-i-rekursiya%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2021%2F08%2Foj-1080x720-12.png&description=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B8%20%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/programmirovanie-kak-vybrat-specializaciju/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/programmirovanie-kak-vybrat-specializaciju/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Программирование: как выбрать специализацию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-11-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Программирование: как выбрать специализацию" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/programmirovanie-kak-vybrat-specializaciju/" data-wpel-link="internal">Программирование: как выбрать специализацию</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/programmirovanie-kak-vybrat-specializaciju/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2021-08-13T19:59:18+00:00">13 августа, 2021</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/obzor-polnofunkcionalnyh-alternativ-populyarnyh-brauzerov/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/obzor-polnofunkcionalnyh-alternativ-populyarnyh-brauzerov/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Обзор полнофункциональных альтернатив популярных браузеров" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-150x100.gif 150w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-300x200.gif 300w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-1024x683.gif 1024w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-768x512.gif 768w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-270x180.gif 270w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-770x515.gif 770w, https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-370x245.gif 370w" data-src="https://otus.ru/journal/wp-content/uploads/2021/08/oj-1080x720-kopiya-1-150x100.gif" data-sizes="(max-width: 150px) 100vw, 150px" title="Обзор полнофункциональных альтернатив популярных браузеров" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/obzor-polnofunkcionalnyh-alternativ-populyarnyh-brauzerov/" data-wpel-link="internal">Обзор полнофункциональных альтернатив популярных браузеров</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/obzor-polnofunkcionalnyh-alternativ-populyarnyh-brauzerov/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2021-08-17T14:09:46+00:00">17 августа, 2021</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">12 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/programmirovanie-i-rekursiya\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 15:07:59 GMT -->