Рекурсия

Сохраняй посты, комментируй и ставь оценки
Есть люди, которые понимают рекурсию быстро, но большинство упираются. Я обучал людей рекурсии на Python и решил поделиться своим подходом. Я упор делаю на практику, чтобы человек именно понимал, как рекурсивный цикл создавать и как он работает, и мог решать задачи через него. Задачи вроде «найти сумму всех чисел в разветвлённой структуре данных». То есть, если совсем просто, в наборе данных, устроенном более сложно, чем список. Понимать вещи вроде стека вызовов и контекста выполнения я учу уже когда человек может прописать рекурсию, после этого теорию понять уже довольно легко.
Ниже запись первого моего вебинара, где я рассказываю, как это делать, но общие моменты распишу здесь
Перед тем, как браться за рекурсию, убедитесь, что более-менее поняли эти темы
Если это есть, то можно пробовать взяться за рекурсию.
Чтобы начать понимать рекурсию, простой вариант пройти два этапа. Первый— нарешать простые задачки на циклы через рекурсию. Сумма, количество элементов, проверка наличия, максимальный элемент и т.д. Второй этап — такие же задачи на списки, элементами которых могут быть списки, элементами которых могут быть списки ... и так до вложенности в 1000.
Как решать:
1. Решаем задачу через цикл
2. Расписываем рекурсию текстом
3. Пишем рекурсивную функцию
Если не получилось, то находим готовые решения задачи и изучаем. Пробуем решить следующую. Время от времени возвращаемся назад и проверяем, можем ли решить прошлые задачи.
Точно так же это должно работать. Вот видео, сам вебинар начинается с 15:57

Рекурсия – очень популярное явление и в нашем реальном мире, и в мире математической абстракции. Понять, что это такое, очень просто. Встаньте между двумя зеркалами. В результате вы увидите большое количество собственных отображений. Большое, но не бесконечное. В нашем мире нет ничего бесконечного, кроме надежд и обещаний. Мораль этой истории такая. Всегда следует учитывать объем имеющихся в распоряжении ресурсов, включая терпение задействованных в процессе персон.
© 2024 Константин Оборотов

Петр Иванович – очень богатый человек. У него своя собственная старая большая фирма. И также своя собственная молодая и стройная жена Тамара. Шли годы, и жизнь Петра Ивановича была стабильной, богатой, счастливой и гармоничной.
Но стали Петра вдруг одолевать мрачные мысли. За что его любит жена? За то, что он такой умный и духовно развитый? Или просто за то, что богатый? К тому же их сын почему-то очень уж похож на нанятого садовника. А дочь вообще на горничную. Поневоле задумаешься!
Садовника и горничную Петр уволил по-тихому, под предлогом, что те, якобы воровали серебряные ложки и редкие семена фиолетовых роз. Петр сделал также тщательную генетическую экспертизу, которая подтвердила его отцовство.
Но осадочек-то, в виде двух детей, остался! Эти дети очень раздражающе напоминали о бывших подозрительных работниках, что было крайне неприятно.
По совету друзей Петр обратился за помощью к опытному психологу, некоему Василию Ивановичу Паку, тонкому знатоку человеческих душ.
- Есть у меня подозрение, что когда я отдам Богу душу, жена моя не будет долго грустить, а, наоборот, обрадуется и начнет кутить на полную катушку, проедая мой капитал, - делился наболевшим Петр с опытным психологом.
- Давайте, сделаем так. Вы притворитесь мертвым, а мы посмотрим и зафиксируем реакцию Вашей жены, - предложил Пак, - так нам откроется истина.
Петр согласился. Было очень любопытно узнать, как среагирует жена.
- О, Боже, горе-то какое! – закричала Тамара в ходе тестирования и упала на колени перед гробом, - позвольте мне лечь в могилу рядом с ним! Если так нельзя, даю вечный обет безбрачия, и траур мой в черных одеждах будет длиться вечно. Надеюсь, что мода на черную классику никогда не пройдет.
Непосвященному человеку тут покажется, что все ясно. Но на самом деле, не все так просто. Тонкость в том, что получив гонорар от Петра, ушлый Василий Пак пошел к Тамаре. Предложил ей за небольшую премию рассказать важный секрет. Тамара согласилась и, благодаря полученной информации, разыграла этот спектакль.
Но и это еще не все! После того, как Тамара отыграла свою роль и ее в обморочном состоянии вынесли из комнаты скорби, психолог на ушко рассказал "покойнику" причину достойного поведения вдовы.
Конечно, мнимый покойник щедро вознаградил Василия Пака. А тот снова рванул к Тамаре с новой ценной информацией.
Тамара тяжело вздохнула, затем сняла с себя золотые сережки и отдала их психологу.
Василий Пак поморщился, он больше любил наличку, но сережки принял. На всякий случай, если вдруг его заластает полиция, он вставил они сережки себя в уши. Отмазка была заготовлена такая. Мол, это подарок от покойной бабушки, и он в память о ней носит эти сережки все время, никогда не снимая.
Весело позвякивая сережками, психолог ломанулся обратно к "покойному", на ходу сочиняя речь о том, что "вдова" в курсе всех предыдущих итераций, а также о новых коварных планах "вдовы".
Долго так бегал Василий Пак между двумя супругами, пока почти совсем их не обанкротил.
Наконец, терпение и финансы Петра Ивановича подошли к концу.
- Послушайте, у вас, вообще, совесть есть? – задал он риторический вопрос, - вам непонятно, что это не может продолжаться бесконечно? И что это добром для вас не закончится? Сколько у Вас сейчас хвостов? Хотите, чтобы я Вам еще один пристроил? Немедленно проснитесь!
Студент Василий поднялся и, под смешки аудитории, осоловевшими глазами посмотрел на Петра Ивановича.
Шла лекция по теме "Проблемы при использовании рекурсивных функций".
Тут преподаватель кафедры информатики Петра Иванович сделал небольшую паузу, задумчиво посмотрел на заспанное лицо Василия и продолжил.
- А теперь задание! Напишите на "Питоне" рекурсивную функцию, определите максимальное количество возможных вложений. И каким образом эта наглая функция "шантажист" наконец грохнется, исчерпав лимит памяти или доверия указанных в тексте персон. Помните, в нашем мире нет ничего бесконечного, кроме надежд и обещаний. А тому, кто отгадает, кто же именно, наконец, убьет Василия Пака, покойник или вдова, получит дополнительный балл за сообразительность. Работаем, работаем!
...
Первоисточник:
===
Ссылки по теме:
Маленькие локальные программы на JS, серия 1
Пример типичного использования рекурсии
Сочинение
Хочешь стать разработчиком? Садись и разрабатывай!
===
Есть такая хрень в программировании как рекурсия. Можно сюдя приплесть и фрактал, но это больше к топологии, а не программированию.
И так, самый простой и понятный пример рекурсии - это берём зеркало впереди себя и сзади. и смотрим на картинку:

Но в программировании это выражается в вызовах функции самой себя, либо кругового вызова функций, например(для знающих Си-подобные языки):
int A(int a) {if(a & 1) a=a+1; return B(a); else return 17;}
int B(int a) {if(a > 500) a=a/3; return C(a); else return 113; }
int C(int a) {if(a ^ 1) return A(a); return -1;}
Грубо говоря, функция А, вызывает функцию Б, функция Б вызывает функцию С, а та уже снова вызывает функцию A. Вроде эти вызовы будут длиться бесконечно, но всегда должно быть условие выхода из рекурсии (под спойлером выше в каждой функции есть такое). Если что - писалось на коленке и практического, и математического смысла не имеет - чисто показать что да как.
А нафига такие сложности? Дело в том, что часто в программировании невозможно обойтись без рекурсий. Да, для понимания её надо сильно поломать свой мозг - именно ломать мышление, а не уставать от напряжённого мозгоштурма.
Однако есть определённый класс рекурсий (в него входят и так называемые "кольцевые", как в спойлере выше). И вот тут срабатывает "Ивент Вомбата", эти рекурсии называются ХВОСТОВЫМИ.
Фишка их в том, что их можно ВСЕГДА развернуть в цикл. Например вычисление числа Фиббоначи:
int Fibb(int a) {if (f<=0) return 1;/*условие выхода из рекурсии*/ return Fibb(a-1)+a;}
Тоже самое разворачивается в цикл вида
int a=123, result=1;
for(int i=0; i>a;;){result = result+a; a=a-1} /*тут мог ошибиться - просьба не пинать*/
return result;
Вроде бы много кода, строк и т.п. Но, рекурсия в общем виде использует стек (который не бесконечен), и дикие затраты на вызов функций внутри рекурсий (на i8086 надо было сохранять каждый процессорный регистр в стеке, а это 2 такта, в i80286 уже появилась pusha, но она так же требовала тактов, ну и переброс из стека в регистры переменных, возврат результата) - накладных расходов на рекурсию очень много, даже в современный процессорах.
Однако, всё что было описано выше прекрасно разворачивается в циклы "умными" компиляторами. Хотя многие алгоритмы с хвостовой рекурсией даже современные компиляторы не могут развернуть в цикл. Примером этого може служить сортировка бинарным жеревом. В рекурсивной форме эта сортировка - задачка студента второго курса (по моим старческим меркам), но компиляторы не способны её раскрутить в цикл, это делалось человеческими мозгами ещё в 80х годах прошлого века (сам разбирал борландовский алгоритм qsort(***) по запчастям обучаясь).
Так что не всё в мире нашем сводится к "хвостам", иногда приходится и сущности плодить поверх ненужного...
Рекурсия – очень популярное явление и в нашем реальном мире, и в мире математической абстракции. Понять, что это такое, очень просто. Встаньте между двумя зеркалами. В результате вы увидите большое количество собственных отображений. Большое, но не бесконечное. В нашем мире нет ничего бесконечного, кроме надежд и обещаний. Мораль этой истории такая. Всегда следует учитывать объем имеющихся в распоряжении ресурсов, включая терпение задействованных в процессе персон.
© 2024 Константин Оборотов

Петр Иванович – очень богатый человек. У него своя собственная старая большая фирма. И также своя собственная молодая и стройная жена Тамара. Шли годы, и жизнь Петра Ивановича была стабильной, богатой, счастливой и гармоничной.
Но стали Петра вдруг одолевать мрачные мысли. За что его любит жена? За то, что он такой умный и духовно развитый? Или просто за то, что богатый? К тому же их сын почему-то очень уж похож на нанятого садовника. А дочь вообще на горничную. Поневоле задумаешься!
Садовника и горничную Петр уволил по-тихому, под предлогом, что те, якобы воровали серебряные ложки и редкие семена фиолетовых роз. Петр сделал также тщательную генетическую экспертизу, которая подтвердила его отцовство.
Но осадочек-то, в виде двух детей, остался! Эти дети очень раздражающе напоминали о бывших подозрительных работниках, что было крайне неприятно.
По совету друзей Петр обратился за помощью к опытному психологу, некоему Василию Ивановичу Паку, тонкому знатоку человеческих душ.
- Есть у меня подозрение, что когда я отдам Богу душу, жена моя не будет долго грустить, а, наоборот, обрадуется и начнет кутить на полную катушку, проедая мой капитал, - делился наболевшим Петр с опытным психологом.
- Давайте, сделаем так. Вы притворитесь мертвым, а мы посмотрим и зафиксируем реакцию Вашей жены, - предложил Пак, - так нам откроется истина.
Петр согласился. Было очень любопытно узнать, как среагирует жена.
- О, Боже, горе-то какое! – закричала Тамара в ходе тестирования и упала на колени перед гробом, - позвольте мне лечь в могилу рядом с ним! Если так нельзя, даю вечный обет безбрачия, и траур мой в черных одеждах будет длиться вечно. Надеюсь, что мода на черную классику никогда не пройдет.
Непосвященному человеку тут покажется, что все ясно. Но на самом деле, не все так просто. Тонкость в том, что получив гонорар от Петра, ушлый Василий Пак пошел к Тамаре. Предложил ей за небольшую премию рассказать важный секрет. Тамара согласилась и, благодаря полученной информации, разыграла этот спектакль.
Но и это еще не все! После того, как Тамара отыграла свою роль и ее в обморочном состоянии вынесли из комнаты скорби, психолог на ушко рассказал "покойнику" причину достойного поведения вдовы.
Конечно, мнимый покойник щедро вознаградил Василия Пака. А тот снова рванул к Тамаре с новой ценной информацией.
Тамара тяжело вздохнула, затем сняла с себя золотые сережки и отдала их психологу.
Василий Пак поморщился, он больше любил наличку, но сережки принял. На всякий случай, если вдруг его заластает полиция, он вставил они сережки себя в уши. Отмазка была заготовлена такая. Мол, это подарок от покойной бабушки, и он в память о ней носит эти сережки все время, никогда не снимая.
Весело позвякивая сережками, психолог ломанулся обратно к "покойному", на ходу сочиняя речь о том, что "вдова" в курсе всех предыдущих итераций, а также о новых коварных планах "вдовы".
Долго так бегал Василий Пак между двумя супругами, пока почти совсем их не обанкротил.
Наконец, терпение и финансы Петра Ивановича подошли к концу.
- Послушайте, у вас, вообще, совесть есть? – задал он риторический вопрос, - вам непонятно, что это не может продолжаться бесконечно? И что это добром для вас не закончится? Сколько у Вас сейчас хвостов? Хотите, чтобы я Вам еще один пристроил? Немедленно проснитесь!
Студент Василий поднялся и, под смешки аудитории, осоловевшими глазами посмотрел на Петра Ивановича.
Шла лекция по теме "Проблемы при использовании рекурсивных функций".
Тут преподаватель кафедры информатики Петра Иванович сделал небольшую паузу, задумчиво посмотрел на заспанное лицо Василия и продолжил.
- А теперь задание! Напишите на "Питоне" рекурсивную функцию, определите максимальное количество возможных вложений. И каким образом эта наглая функция "шантажист" наконец грохнется, исчерпав лимит памяти или доверия указанных в тексте персон. Помните, в нашем мире нет ничего бесконечного, кроме надежд и обещаний. А тому, кто отгадает, кто же именно, наконец, убьет Василия Пака, покойник или вдова, получит дополнительный балл за сообразительность. Работаем, работаем!
...
Первоисточник:
===
Ссылки по теме:
Маленькие локальные программы на JS, серия 1
Пример типичного использования рекурсии
Сочинение
Хочешь стать разработчиком? Садись и разрабатывай!
===