Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_18_Рекурсия .ppt
Скачиваний:
26
Добавлен:
11.05.2015
Размер:
388.1 Кб
Скачать

Две стратегии разбиения на подзадачи

• Стратегия

«разделяй и властвуй»

• Стратегия «динамического

программирования»

02.07.19

21

Стратегия

«разделяй и властвуй»

Задача разбивается на независимые подзадачи (части) меньшей сложности (размерности).

Каждая подзадача решается отдельно.

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

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

02.07.19

22

Недостаток стратегии РиВ

Не всегда удается разбить задачу на независимые подзадачи.

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

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

02.07.19

23

Стратегия

«динамического программирования»

задача погружается в семейство задач той же природы (другими словами, разбивается на зависимые (могут пересекаться) подзадачи);

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

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

Программируется итерационный алгоритм.

02.07.19

24

Суть стратегии ДП

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

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

Эта стратегия за счет увеличения затрат памяти позволяет избавиться от повторного решения пересекающихся подзадач.

02.07.19

25

Программирование рекуррентных соотношений

Программно рекуррентные соотношения можно реализовать с помощью обычных циклов (итерационно) и с помощью рекурсии.

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

В языке Delphi процедуры и функции рекурсию допускают.

02.07.19

26

Вычисление n!

Вначале запишем рекурсивное соотношение

а) 0!=1; б) n!=(n-1)!*n.

Function F

begin

Тривиальная

задача

if i=0 then F:=1

else F:=i*F(i-1);

end;

Обращение

02.07.19

Элементарные

подзадачи

6! u:=F(6);

27

Найдем максимум a1...an

Воспользуемся рекурсивным определением:

max (a1) =a1 - тривиальная задача

max (a1,a2) – элементарная задача

Решается: if a1>a2 then a1 else a2

Более сложные выразим через элементарные

max (a1...ai) = max (max (a1...ai-1), ai)

Или

max (i) = max (max (i-1), ai)

02.07.19

28

Нахождение max(a1..an) (как метод класса)

Unit unit2;

Из рекурсивной

Interfase

подпрограммы Mxr

Type

удалены все

mas1=array[1..100] of

лишние параметры

для уменьшения

Tob=class(Tobject)

стековой памяти

a:mas1;

Function Mxr(i:Word):extended;

End;

Implementation

Function Tob.Mxr;

Var z:extended;

тривиальная

begin

 

if i=1 then Mxr:=a[1]

элементарные

Else begin z:=Mxr(i-1);

 

If z>a[i] then Mxr:=z

else Mxr:=a[i];

end;

 

end; //конец Mxr

29

 

02.07.19

Нахождение max(a1..an)

Uses unit2;

Var ob:Tob; n,i:word;

. . .

Ob:=Tob.create;

n:=20;

For i:=1 to n do

ob.a[i]:=StrToFloat(stringGrid1.cells[i,0]);

Mxa:=ob.Mxr(n);

Ob.Free;

02.07.19

30