Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОМП. НАУКИ_1сем.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
902.14 Кб
Скачать
  1. Рекурсия

    1. Что такое рекурсия

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

Рассмотрим задачу вычисления факториала n!, означающего число различных перестановок последовательности из n элементов. Факториал определяется через произведение n!=12...n. Оно конечно и вычисляется с помощью цикла F:=1; for i:=1 to n do F:=F*i.

Рассмотрим рекуррентные формулы:

{1} 0!=1;

{2} n!=n(n-1)!, для любого n>0.

Определение {2} сводит задачу вычисления n! к вычислению (n-1)! и т.д. до тех пор, пока задача не сведется к вычислению 0!, решение которой следует из определения {1}. Например:

3!=32!, 2!=21!, 1!=10!, 0!=1. Тогда, двигаясь в обратном порядке, получим: 1!=11=1, 2!=21!=21=2, 3!=32!=32=6

Определения с помощью рекуррентных формул являются рекурсивными определениями.

Рекурсивным определением объекта называют такое определение, которое содержит внутри себя ссылку на определяемый объект.

Объект называется рекурсивным, если он частично определяется через самого себя.

Мощь рекурсивного определения объекта в том, что такое конечное определение способно описывать бесконечно большое число объектов.

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

    1. Рекурсивные подпрограммы

Рекурсия в программировании – это такой способ организации процесса вычислений, при котором подпрограмма (процедура или функция) обращается сама к себе.

Пример рекурсивной функции, вычисляющей факториал:

function RFact(n:integer):integer;

begin

if n=0 then RFact:=1

else RFact:=n*RFact(n-1)

end;

Глубина рекурсии – максимальное число рекурсивных вызовов подпрограммы без возврата во время ее выполнения.

Текущий уровень рекурсии – число рекурсивных вызовов в каждый конкретный момент времени.

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

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

На рекурсивном спуске в функции RFact ничего не вычисляется, мы рекурсивно вызываем эту функцию, уменьшая значение ее параметра на 1 в ожидании того момента, когда значение параметра станет 0. Например, при n=3:

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

Рекурсивный возврат – вычисление факториала

Fact(3)=3*Fact(2)

Fact(2)=2*Fact(1)

Fact(1)=1*Fact(0)

Fact(0)=1

Fact(3)=3*2=6

Fact(2)=2*1=2

Fact(1)=1*1=1

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