I-keramika.ru

Строй Журнал I-Keramika.Ru
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как работает рекурсия – объяснение в блок-схемах и видео

Как работает рекурсия – объяснение в блок-схемах и видео

Представляю вашему вниманию перевод статьи Beau Carnes How Recursion Works — explained with flowcharts and a video.

Рекурсию порой сложно понять, особенно новичкам в программировании. Если говорить просто, то рекурсия – это функция, которая сама вызывает себя. Но давайте попробую объяснить на примере.

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

Вы открываете коробку только чтобы найти… еще больше коробок. Коробки внутри коробок и вы не знаете, в какой из них Ваш ключ. Вам срочно нужна рубашка, так что вам надо придумать хороший алгоритм и найти ключ.

Есть два основных подхода в создании алгоритма для решения данной проблемы: итеративный и рекурсивный. Вот блок-схемы этих подходов:

Какой подход для Вас проще?

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

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

Оба подхода выполняют одно и тоже. Основный смысл в использовании рекурсивного подхода в том, что однажды поняв, вы сможете легко его читать. В действительности нет никакого выигрыша в производительности от использования рекурсии. Порой итеративный подход с циклами будет работать быстрее, но простота рекурсии иногда предпочтительнее.

Читайте так же:
Каким цветом покрасить лавочку

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

Граничный и рекурсивный случай

То, что Вам необходимо принять во внимание при написании рекурсивной функции – это бесконечный цикл, т.е. когда функция вызывает саму себя… и никогда не может остановиться.
Допустим, Вы хотите написать функцию подсчета. Вы можете написать ее рекурсивно на Javascript, к примеру:

Эта функция будет считать до бесконечности. Так что, если Вы вдруг запустили код с бесконечным циклом, остановите его сочетанием клавиш «Ctrl-C». (Или, работая к примеру в CodePen, это можно сделать, добавив “?turn_off_js=true” в конце URL.)

Рекурсивная функция всегда должна знать, когда ей нужно остановиться. В рекурсивной функции всегда есть два случая: рекурсивный и граничный случаи. Рекурсивный случай – когда функция вызывает саму себя, а граничный – когда функция перестает себя вызывать. Наличие граничного случая и предотвращает зацикливание.

И снова функция подсчета, только уже с граничным случаем:

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

Сначала мы выведем цифру 5, используя команду Console.Log. Т.к. 5 не меньше или равно 1, то мы перейдем в блок else. Здесь мы снова вызовем функцию и передадим в нее цифру 4 (т.к. 5 – 1 = 4).

Мы выведем цифру 4. И снова i не меньше или равно 1, так что мы переходим в блок else и передаем цифру 3. Это продолжается, пока i не станет равным 1. И когда это случится мы выведем в консоль 1 и i станет меньше или равно 1. Наконец мы зайдем в блок с ключевым словом return и выйдем из функции.

Читайте так же:
Терра сб 2797 сборка

Стек вызовов

Рекурсивные функции используют так называемый «Стек вызовов». Когда программа вызывает функцию, функция отправляется на верх стека вызовов. Это похоже на стопку книг, вы добавляете одну вещь за одни раз. Затем, когда вы готовы снять что-то обратно, вы всегда снимаете верхний элемент.

Я продемонстрирую Вам стек вызовов в действии, используя функцию подсчета факториала. Factorial(5) пишется как 5! и рассчитывается как 5! = 5*4*3*2*1. Вот рекурсивная функция для подсчета факториала числа:

Теперь, давайте посмотрим что же происходит, когда вы вызываете fact(3). Ниже приведена иллюстрация в которой шаг за шагом показано, что происходит в стеке. Самая верхняя коробка в стеке говорит Вам, что вызывать функции fact, на которой вы остановились в данный момент:

Заметили, как каждое обращение к функции fact содержит свою собственную копию x. Это очень важное условие для работы рекурсии. Вы не можете получить доступ к другой копии функции от x.

Нашли уже ключ?

Давайте кратенько вернемся к первоначальному примеру поиска ключа в коробках. Помните, что первым был итеративный подход с использованием циклов? Согласно этому подходу Вы создаете стопку коробок для поиска, поэтому всегда знаете в каких коробках вы еще не искали.

Но в рекурсивном подходе нет стопки. Так как тогда алгоритм понимает в какой коробке следует искать? Ответ: «Стопка коробок» сохраняется в стеке. Формируется стек из наполовину выполненных обращений к функции, каждое из которых содержит свой наполовину выполненный список из коробок для просмотра. Стек следит за стопкой коробок для Вас!

И так, спасибо рекурсии, Вы наконец смогли найти свой ключ и взять рубашку!

Вы также можете посмотреть мое пятиминутное видео про рекурсию. Оно должно усилить понимание, приведенных здесь концепций.

Читайте так же:
Как измеряется периметр и площадь фигуры

Заключение от автора

Надеюсь, что статья внесла немного больше ясности в Ваше понимание рекурсии в программировании. Основой для статьи послужил урок в моем новом видео курсе от Manning Publications под названием «Algorithms in Motion». И курс и статься написаны по замечательной книге «Grokking Algorithms», автором которой является Adit Bhargava, кем и были нарисованы все эти замечательные иллюстрации.

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

От себя хочу добавить, что с интересом наблюдаю за статьями и видеоуроками Beau Carnes, и надеюсь что Вам тоже понравилась статья и в особенности эти действительно замечательные иллюстрации из книги A. Bhargav «Grokking Algorithms».

Как поэтапно нарисовать книгу

5

Нарисовать этот кладезь знаний довольно просто. Давайте рассмотрим все поэтапно.

Этап 1
Сделайте эскиз будущего тома. Прочертите прямоугольник немного под наклоном. Посередине прямоугольника проведите вертикальную линию.

1

Этап 2
Как вы уже поняли, том будет открытый. Поэтому необходимо изобразить слегка согнутые страницы. Для этого от вертикальной черты проведите 2 изогнутые линии сверху и снизу, как показано на рисунке. Также обратите внимание, что на этом этапе нужно прорисовать корочку переплета.

2

Этап 3
Теперь дополните деталями, например закладкой. По бокам и снизу легкими движениями руки прорисуйте линии, которые воссоздают стороны издания. Сотрите все лишние линии.

3

Этап 4
Легкими штрихами наложите светотень для большей реалистичности. Можно дополнить картинками и строками.

45

Книги по возрасту и ситуации

По понятным причинам мамы и папы торопятся перейти к более увлекательным книгам: повестям Линдгрен, мемуарам Муми-папы, приключениям Волшебника Изумрудного Города. Но дети должны пройти и через потешки, и через русские народные сказки, короткие стихи и песенки. Каждому возрасту – свои книги. В сказках для малышей не должно быть много вводных слов и сложных речевых оборотов. Чуковский писал, что детские стихи нельзя загромождать эпитетами, основной смысл в них несут глаголы и существительные, а каждая строфа – графична, ведь дети мыслят образами. И если двустишие невозможно нарисовать, значит, такие стихи непригодны для детей

Читайте так же:
Ширина глубина высота на схеме коробки

Книги должны быть увлекательными, а ситуации, описанные в них – знакомыми. Сначала любимыми героями детей являются животные, а когда читатели вступают в период социализации (обычно это связано с началом посещения детского сада в возрасте 3-4 лет), им становятся интересны книги о сверстниках. Поэтому родителям нужно интересоваться содержанием, изучать книжные обзоры, отзывы и рецензии других читателей.

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

Шаг пятый: сделайте прямо сейчас

Если у вас есть возможность сделать что-то сразу же, не записывая на стикер – сделайте это. Не ждите лучшего момента – он не наступит. Лучшее время, когда вы можете сделать что-то – прямо сейчас. Не откладывайте.

Даже если это долговременная привычка. Например, вы решили начать отжиматься. Отожмитесь прямо сейчас! Так вы запомните, что вам нужно это делать, без карточек.

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

Автор: Игорь Болтовнин

Понравилась статья? Присоединяйтесь к нашим сообществам в соцсетях или каналу в Telegram и не пропускайте выход новых полезных материалов:
Telegram Вконтакте Facebook

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector