Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / Виды и методы абстракции.DOC
Скачиваний:
36
Добавлен:
23.03.2015
Размер:
90.62 Кб
Скачать

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

Обычно всякое новое понятие опр-ся через другие понятия, кот. предполагаются уже известными. (напр tg(x)=sin(x)/cos(x)).

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

Пр.: n! = {1, если n=0; n*((n-1)!), если =n>0} На первый взгляд это определении кажется бессмысленным, но оно работает! 0!=1, 1!=1, 2!=2,… Это определение отличается от бесполезных, хотя и верных определений

(1) fact(n)=fact(n+1)/((n+1)(n+2)) или (2) fact(n)=fact(n)

Отличия: равенство это не определение, а требование к функциям. Второе – ему удовлетв. любая функция. Первое более сильное, но ему удовл. ф-я вида fact1(n)=c*fact(n) при любом натур. с.

И, наконец, требованию удовл лишь одна ф-я.

Предп. что их две. Пусть это f1 и f2. Это значит, что : f1(0) = f2(0) = 1; f1(n) = n*f1(n-1); f2(n) = n*f2(n-1). Докажем, что f1(k)=f2(k). при любом нат. к. Рассуждаем по индукции:

1) Базис индукции f1(0)=f2(0)=0

2) Шаг индукции. Предп., что f1(k-1)= f2(k-1) Докажем, что f1(k)=f2(k) Действительно f1(k)=k*f1(k-1)=k*f2(k-1)= f2(k), доказанно. Доказанное позволяет рассматривать как определение – опр-е той единственной ф., которая этоим треб-ям удовл. Такие определение называется рекурсивным. Заметим, что наше доказательство, по-существу, без изменений и на двум. случ. В частности условия f(0)=a, f(n)=F(n,f(n-1)), при n>0 однозначно определяют ф. f:N->N, каковы бы ни были натуральное число a и ф-я 2-х натуральных аргументов F.

Рекурсивный – значит использующий самого себя. Примеры часто встречаются в жизни. Пр. Выяснение значения слова: 1)найти слово в словаре, 2)прочитать статью, объясняющую значение этого слова, 3)если объяснение понятно, то продолжаем чтение с прерванного места, 4)если в объяснении есть незнакомое слово, то прекращаем чтение текущей статьи, запоминаем место и выясняем значение незнакомого слова, пользуясь правилом «Выяснение значения слова». Рекурсия в программировании: Р., т.е. возможность ввести в опр-е объекта ссылку на сам объект, часто возникает в программировании. Р. – это один из фундаментальных «концептуальных» инструментов, имеющихся в распоряжении программиста. Рекурсивные опр-я часто используются в програм-нии для опред. структур данных.

Пр.type ListPtr= ^List

List = record

info: InfoType;

Next: ListPtr;

end;

или

type

BinTreePtr = BinTree;

BinTree = ^record

info : Information;

left : BinTreePtr;

right: BinTreePtr;

end;

Для обработки «рекурсивных» структур вполне естественным является использование рекурсивных алгоритмов. Пр: Программа вычисления высоты дерева может быть определена как: Высота(t) = {0, если t=nil; 1+max(Высота(left), Высота(right)), если t<>nil}

Свойства рекурс. алгоритмов.1)Прежде всего рекурсия может быть прямой и косвенной:

procedure a(xi…);

begin

B(f(x))

end;

procedure a(yi…);

begin

a(g(y))

end;

2)Другое важное условие, касающееся использования рекурсии, состоит в том, что объекты, порожденные рекурс. опр-ем (будь то инф стр-ры или вычисления) должны быть конечными. Следовательно, вся совок. рекурсивных подпрограмм должна включать такое положение, при котором в определенных частных случаях вычисление могло бы делиться непосредственно, без рекурс. вызова, т.е. одна из подпрогр. должна иметь такой вид:

если с то

Aпрям

иначе

Врекурс

все-если

или

пока не с повторять

Врек

все-пока

Апрям

3) Существует управляющая величина рекурсии m>=0, кот-я убывает с каждым рекурсивным вызовом и когда m=0 рекурс. алг-м завершается.

Этапы рекурс. анализа. Как искать рекурсивные решения? Задача особенно удобна для рекурсивного анализа, если она может быть разложена на совокупность подзадач того же типа, но меньшей размерности. В таком случае общая методика этого анализа (3 этапа): 1)параметризация задачи – заключается в выделении различных элементов, от которых зависит решение и, в частности, размерность решаемой задачи, причем размерность должна (в благоприятных случаях) убывать после каждого рекурсивного вызова, 2)поиск тривиального случая и его решение – зачастую это ключевой этап алгоритма, который может быть решен непосредственно, без рекурсивного вызова. При этом часто размерность задачи нулевая или = 1, 3)декомпозиция общего случая, имеющая целью привести его к одной или нескольким задачам, в основном более простым (меньшей размерности).

Управляющая величина рекурсии. Это некоторая, связанная с этой программой неотрицательная величина m, которая СТРОГО убывает при каждом рекурсивном вызове. В простейшем случае роль такой управляющей величины может играть один из параметров подпрограммы.

Такая программа может иметь вид:

procedure C(n: byte; x,y,z…)

begin

if n=0 then

Априя

else

Bрек

вызов имеет вид:

C(n-1, f(x), g(y), h(z), ….)

. . . . . . . . . .

end

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

Соседние файлы в папке POSIBNIK