Déjà vu’

Впервые я услышал термин "рекурсивный" в 2013 году. Сначала я подумал:"Я выучил курсив еще в начальной школе, что такого сложного в эффективном письме?"

Рекурсивные функции — это функции, которые из-за отсутствия лучшего понимания вызывают сами себя для выполнения задачи. Я изучал рекурсию и то, как она на самом деле работает на YouTube. Я наткнулся на довольно информативное видео с примером, который, по моему мнению, стоит обсудить здесь.

def count(n):
     if n > 0:
          print n
          count (n - 1)
     else:
          print "Done"

В частности, изученным примером был пример:

>>> count(3)
3
2
1
Done

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

Для начала функция count обрабатывает свой аргумент n как локальную переменную. Во втором блоке кода мы передали n = 3, которое затем передается в операторы if. Если это значение n больше 0, то код сначала напечатает n (которое равно 3), а затем создаст новый вызов функции count.

Мне нравится думать об этом шаге как о сталагмите. Когда вода капает с потолка на дно сталагмита, образуется новый слой соли. Точно так же каждый раз, когда count вызывается рекурсивно, мне нравится думать о формировании нового (временного) «слоя», который вызывает функцию со слегка измененным аргументом. В приведенном выше примере мы знаем, что это n-1. Таким образом, count теперь вызывается внутри этого нового «уровня» с аргументом 3–1 = 2. Теперь внутри этого уровня аргумент 2 снова вводится в оператор if. Если 2 > 0, то печатается 2 и инициируется еще один вызов count.

Этот процесс повторяется для второго «слоя» count(n-1), где аргумент теперь относится к 2–1 = 1. 1 будет напечатано, а следующая строка кода вызовет передачу аргумента 1–1. 1 = 0. В этот момент, четвертый «уровень», аргумент попадет в блок else и немедленно вернет «Готово». Однако последний шаг заключается в том, что все эти «слои» были лишь временными, как указано выше. Затем каждый «слой» выходит из кода для записи, и его «фреймы активации» исчезают, начиная с самого глубокого слоя. В этом случае у нас был слой 4 как самый глубокий, где n = 0.

Что касается изображения моего журнала, размещенного выше, я считаю, что эта функция прекрасно иллюстрирует общую схему рекурсивной функции. У него есть оператор if — else для остановки рекурсивного процесса. В функции есть несколько условий, которые позволяют ей выполнить задачу — в данном случае считать в обратном порядке, начиная с n-гоаргумента.

Рекурсия кажется мощным инструментом в нашем наборе инструментов. Мне понадобится гораздо больше практики в этом, но я чувствую, что идея рекурсии хорошо переносится между большинством объектно-ориентированных языков программирования для моих последних лет.