Научная статья на тему 'ОСНОВНЫЕ ПОНЯТИЯ И ТЕРМИНОЛОГИЯ РЕКУРСИ'

ОСНОВНЫЕ ПОНЯТИЯ И ТЕРМИНОЛОГИЯ РЕКУРСИ Текст научной статьи по специальности «Техника и технологии»

CC BY
241
27
i Надоели баннеры? Вы всегда можете отключить рекламу.
Журнал
Endless light in science
Область наук
Ключевые слова
рекурсия / эффективность рекурсии / рекурсивный процесс / стек / теория алгоритмов

Аннотация научной статьи по технике и технологии, автор научной работы — Рагимова Гюлара Али, Гусейнова Зарифа Рамиз

В данной статье рассматриваются основные понятия рекурсии,области применения рекурсии и сам рекурсивный процесс.Рекурсия-это удивительная и простая техника,которая применяется во многих языках программирования,в особенности в таких распространненых как С,JavaScript и Python.Рекурсия позволяет решить даже самые сложные задачи,разделив их на подзачи.Стоит отметить,что рекурсия это один из рекуррентных способов(рекуррентные отношения тоже описываются в данной статье).К рекуррентным способам также относятся и итеративный способ,который тоже рассматривается в данной статье.Нужно понимать в решении каких задач лучше использовать рекурсивный способ,а при каких задач-итеративный способ.Разница состоит в том,что рекурсивный способ более наглядный и занимает много местп в стеке из-за повторных вычислений(понятия стека и кучи также описывается в статье),а итеративный процесс работая циклами занимает куда меньше места в стеке,но он не описывает функцию

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «ОСНОВНЫЕ ПОНЯТИЯ И ТЕРМИНОЛОГИЯ РЕКУРСИ»

ОСНОВНЫЕ ПОНЯТИЯ И ТЕРМИНОЛОГИЯ РЕКУРСИИ

РАГИМОВА ГЮЛАРА АЛИ, доцент

Бакинский Государственный Университет, кафедра Информатика

ГУСЕЙНОВА ЗАРИФА РАМИЗ, магистрант

Бакинский Государственный Университет

Аннотация: В данной статье рассматриваются основные понятия рекурсии,области применения рекурсии и сам рекурсивный процесс.Рекурсия-это удивительная и простая техника,которая применяется во многих языках программирования, в особенности в таких распространненых как С,JavaScript и Python.Рекурсия позволяет решить даже самые сложные задачи,разделив их на подзачи.Стоит отметить,что рекурсия это один из рекуррентных способов(рекуррентные отношения тоже описываются в данной статье).К рекуррентным способам также относятся и итеративный способ,который тоже рассматривается в данной статье.Нужно понимать в решении каких задач лучше использовать рекурсивный способ,а при каких задач-итеративный способ.Разница состоит в том,что рекурсивный способ более наглядный и занимает много местп в стеке из-за повторных вычислений(понятия стека и кучи также описывается в статье),а итеративный процесс работая циклами занимает куда меньше места в стеке,но он не описывает функцию.

Ключевые слова: рекурсия, эффективность рекурсии, рекурсивный процесс, стек, теория алгоритмов

Рекурсия (с лат. геш^ю-возвращать) - это нахождение следующего шага, путём возвращения к предыдущему шагу.

Стоит отметить, что теория алгоритмизации и ее широкое применение в науке тесно связано с именем американского математика Д.Кнута.Также стоит отметить следующих ученых, проводивших важные исследования в области алгоритмизации. Эти ученые -это Петр Р., Малийчев А.И., Вегенер И., Верещагин Н.К., Ульман С.Д., Жеретинга Н.Н. , Немнюгин С., Магилев А.В., Пак Н.Н.,Хеннер Е.К и другие.

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

Пример. Ханойские башни (рис.1), Ряд Фиббоначи: 1 1 2 3 5 8 13 21 .

Каким же образом начилось широкое применение рекурсивного метода? Оно начилось с широкого распространения универсального языка АЛГОЛ-60. Именно с распостранение и различное применение этой программы доказало, что рекурсия-это эффективный способ для решения поставленных задач.

Термин рекурсия находит свое применение в абсолютно разных и практически не связанных между собой областях знаний. Рекурсия находит свое применение от лингвисти до логики. Однако больше всего этот термин применяется в таких дисциплинпх как математика и информатика. Математические функции заданные рекуррентной формулой (рекуррентные функции - это функции, которые решают поставленные перед ними задачи, путем возвращения к предыдущим шагам. Рекуррентный процесс-это рекурсивный или итеративный процесс. Эти понятия рассматриваются в статье более подробно), также рассматриваются как рекурсивная функция. В качестве примера, тесно связанного с рекурсией, можно привести метод математической индукции.

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

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

Рекурсия - это очень удивительная, и в то же время простая техника. С ее помощью, мы можем уменьшить длину кода и упростить его чтение и запись. Она имеет не мало преимуществ перед итерационным методом, который будет обсуждаться позже. Для задачи, которую можно решить с помощью аналогичной позадачи, рекурсия будет является одним из лучших решений. [1.стр. 11-19].

Здесь мы опишем, как проходит рекурсивный процесс:

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

2) На каждом этапе мы пытаемся вводить меньшие входные данные, чтобы уменьшить подзадачу.

3) Также необходимо будет задать базовое условие необходимо для остановки рекурсии,иначе возникнет бесконечный цикл.

Также, как говорилось ранее, для полного описания рекурсивного процесса, необходимо дать понятие итерационного процесса и понятие хвостовой рекурсии. [1.стр. 2528].

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

Итеррационный процесс - это практика решений заданий, процессов, идей и инициатив посредством проведения множества итераций. Эти итерации являются частью циклического процесса. Чем же циклический процесс отличается от линейного процесса? В циклическом процессе шаги повторяются нужное количество раз, до получение нужного результата,а в линейном процессе шаг происходит только один раз.

Повторное выполнение некоторых групп операторов кода в программе называется итерацией.

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

Но, прежде чем мы опишем стек, не мало важно описать и следующие моменты.

Оперативная память делится на раздела: стек (stack) и кучу (heap).

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

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

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

Что такое стек?

Стек (от англ..stack-стопка),также называемый магазинной или нанизанной памятью,представляет собой массив или структуру списка вызовов функций, параметров, используемых в современном программировании и архитектуре центрального процессора. Подобно стопке тарелок, элементы в стопке добавляются или удаляются с вершины стопки в порядке: последний вошел - первый вышел, так далее в порядке LIFO (last in first out) [2.стр.54-60].

Процесс добавления данных в стек, называется "push", а извлечение данных из стека "pop". Это происходит в верхней части стека. Указатель стека указывает размер стека, настраиваемый по мере того, как элементы помещаются в стек или извлекается из него. Когда в стеке информация становится не нужной, она автоматики удаляется, тем самым освобождая ячейки для новых данных.

При вызове функции адрес следующей функции помещаетя в стек. Когда функция завершается, адрес извлекается из стека, и выполнение продолжается по этому адресу.

Действия в стеке.

Перечислим действия, которые можно выполнять со стеком, в зависимости от среды программирования.

Peek: позволяет просматривать самый верхний элемент в стеке, не удаляя элемент [З.стр. 95-97].

Обмен: меняется положение двух верхних элементов стека. Первый элемент становится вторым, а второй становится верхним.

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

Поворот. это действие называется прокруткой. Поворот указывает на количество элементов в стеке, которые поворачиваются в порядке их следования. Например:поворот двух верхних элементов стека переместиться самый верхний элемент, а следующие элементы переместятся на одну позицию вверх.

Рекурсивный процесс

Сама идея рекурсивного процесса похожа на процесс математической индукции. Т.е. задача понижает сложность до такой сложности, а пока она решается непосредственно.

Что такое базовая структура рекурсивного процесса?

Для описания рекурсивного процесса нам нужно дать следующие определения:

1) определение рекурсивных параметров;

2) определение условия завершения и базовый расчёт рекурсии.

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

Также, не мало важно дать определения рекурсивного вызова, когда рекурсивный параметр не равен условию завершения. В таких случаях, расчёт представляется в виде расчёта, включаегося в себя вызов в самого себя, где параметр будет ближе к завершенному состоянию. Также, базовая структура рекурсионной функции в основном включает в себя основные вычисления и рекурсивные вызовы [4.стр. 102-105].

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

Каждый рекурсивный вызов - это независимо запущенный шаг функции и имеет независимые переменные и параметры для каждого шага. Следовательно, процесс выполнения рекурсивной функции можно рассматривать как вызов другой функции с таким же кодом.

Дизайн и эффективность рекурсивной функции.

Анализируется основные проблемы проектирования рекурсивных функций и программ.

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

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

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

Также, не мало важно, описывая рекурсию и ее функцию, указать про бинарное дерево (binary tree).

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

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

Если у бинарного узла нет потомков, он называется листом.Также бинарное дерево может быть и пустым множеством.

Стоит отметить также практическую пользу "бинарного дерева". Благодаря этому свойству, браузер гораздо быстрее может осуществлять поиск [5.стр. 45-48].

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

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

Если рассмотреть дерево рекурсии, образованный алгоритмом для вычисления чисел Фибоначчи, то будет заметно, что тем ниже уровень рекурсии, тем больше встречаются вызовы с одинаковыми аргументами. Чтобы решить эту проблему, создается специальный массив, в котором будет храниться раньше вычисленные значения. Тем самым дерево рекурсии сокращается в разы.

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

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

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

ОФ "Международный научно-исследовательский центр "Endless Light in Science"

Бывают и частные случаи. Если дерево рекурсии широкое, например тернарное (от лат."temariш"-тройной оператор имеющий три операнта), то количество листьев в отношению к общему количества вершин дерева будет превышать половину. Требуется организовать рекурсивный процесс вычисления так,чтобы процесс рекурсии проходил на один или несколько уровней выше. В таком случае трудаемкость будет немного меньше,чем при полном дереве рекурсии. Один из основных примеров-алгоритм сортировки слиянием.

Если процесс рекурсии происходит по всей длине массива,равной двум или трем, то число вершин дерева рекурсии сокращается как минимум вдвое. Трудоемкость сокращается за счет того, что затрачиваемое время на количество операций в массиве в листьях деревьев сокращается.

Ресурсная эффективность

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

Заключение.

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

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

СПИСОК ЛИТЕРАТУРЫ:

1.В.Берж Методы рекурсивного программирования Москва «Машиностроение» 1983 г.

2.Мальцев А.И. Алгоритмы и рекурсивные функции. Монография.2016 г.

3.Баррон Д.Рекурсивные методы в программировании. Мир 1974.

4. Фалевuч Б. Теория алгоритмов. Учебное пособие. Машиностроение, 2004.

5. Гудман С., Хидетниеми С. Введение в разработку и анализ алгоритмов. Мир, 1981.

i Надоели баннеры? Вы всегда можете отключить рекламу.