- •Лекция 9. Рекурсия Введение
- •Рекурсивные описания алгоритмов.
- •Реализация рекурсии
- •Примеры рекурсивных и нерекурсивных описаний
- •Var I: Integer; y: Real;
- •Var X:Integer;
- •Var s: Sequence;
- •Var I: Integer;
- •Var j : integer; Buf: Char;
- •Var s : Sequence;
- •Var j : integer;
- •Техника рекурсивных описаний
- •Var I, j, y, z : Integer;
- •Var a, X : Vector; b : Integer; I : Integer;
- •Преимущества и недостатки рекурсивных алгоритмов
У попа была собака. Он ее любил.
Она съела кусок мяса, он ее убил.
И на могиле написал:
«У попа была собака…
Лекция 9. Рекурсия Введение
Среди многочисленных специальных приемов описания алгоритмов рекурсия занимает особое место. Применение рекурсивных описаний алгоритмов можно сравнить с применением метода математической индукции в доказательствах математических теорем.
Нерекурсивное описание алгоритма решения задачи представляет собой ход решения этой задачи, выраженный в явном виде.
Рекурсивные описания алгоритмов содержат только спрособ сведения решаемой задачи к такой же задаче, только «меньшего размера».
Доказывая теорему неиндуктивным методом, математик использует логические рассуждения, опираясь на другие теоремы и аксиомы.
При доказательстве теоремы методом математической индукции он должен предположить, что доказываемая теорема справедлива при «меньшем» значении параметра индукции и, опираясь на это предположение, доказать теорему для данного значения параметра индукции. Обоснование законности такого способа рассуждений берет на себя математика (Метод математической индукции – один из общематематических законов – постулатов математики).
Необходимость использовать описываемый алгоритм для своего собственного описания часто приводит к чисто психологическим затруднениям. Возникает законный вопрос: нужны ли рекурсивные описания вообще?
В теории алгоритмов и теории программирования рекурсивные описания алгоритмов и программ играют центральную роль – такую же, как и метод математической индукции в математике.
Для описания подавляющего большинства алгоритмов решения практических задач программирования рекурсия не используется просто потому, что в этом нет необходимости. Относительно простые с точки зрения алгоритмистики задачи решаются с использованием простых средств и методов.
Однако, если, например, в задаче необходимо осуществить сложный перебор многих вариантов, без рекурсии обойтись трудно.
Кроме переборных задач, существуют и другие классы задач, решение которых естественным образом использует рекурсивные описания. При этом, конечно, можно обойтись и без рекурсии, однако придется моделировать рекурсивные вычисления нерекурсивными методами.
Рекурсивные описания алгоритмов.
Технология программирования на языках процедурного программирования (типа языка Паскаль) предлагает проектировать программы методом последовательных уточнений.
Концепция процедур и функций (подпрограмм) позволяет выделить подзадачу как явную подпрограмму и оформить ее в виде процедуры или функции. Таким образом, программа представляет собой структуру, элементами которой являются процедуры и функции – основные семантические единицы программы.
В частности, в качестве подзадачи может фигурировать и исходная задача с измененными исходными данными (задача «меньшего размера»).
Пример 1.
Поиск минимального элемента в последовательности
a1, a2, .., ak, ak+1,.., an
можно организовать как
поиск минимального элемента b1 в a1, a2, .., ak ;
поиск минимального элемента b2 в ak+1, ak+2, .., an ;
выбор наименьшего элемента b из двух найденных (b1, b2).
Основная идея состоит в том, чтобы разбить последовательность на две части a1, a2, .., ak и ak+1, ak+2, .., an , применить описываемый метод к каждой из этих частей, а затем выбрать наименьший элемент из двух найденных. Такие алгоритмы называют рекурсивными.
Описание процедуры (функции) P, в разделе операторов которой используется оператор этой процедуры (вызов функции), называется рекурсивным.
Рис. 1. Схема простой рекурсии
Использование рекурсивного описания процедуры (функции) приводит к рекурсивному выполнению этой процедуры (вычислению этой функции).
Пример 2. Факториал.
Рассмотрим рекурсивное определение факториала натурального числа n - функции n! = 1*2*...*n. Пусть F(n) = n!! Тогда
1.F(0) = 1
2.F(n) = n*F(n - 1) при n > 0
Средствами языка это определение можно сформулировать как вычисление:
If n = 0
then F := 1
else F := F(n - 1) * n
Оформив это вычисление как функцию, получим:
Function F(n: Integer): Integer;
Begin
If n = 0
then F := 1
else F := F(n - 1) * n
End;