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

Итерация - от человека.

Рекурсия – от Бога.

Л.Питер Дойч

02.07.19

31

Класс c методом ввода массива

Unit unit2;

uses Grids,SysUtils;

Interfase

Type mas1=array[1..100] of extended;

Tob=class(Tobject)

a:mas1;

Procedure reda(s:Tstringgrid;n:word);

Function Mxr(L,R:Word):extended;

Function Mxri(L,R:Word):word;

End;

Implementation

Procedure Tob.reda;

Var i:word;

Begin

For i:=1 to n do

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

 

End;

32

 

02.07.19

Найти max делением пополам

max(a1..an)= max (max (a1...an/2), max (an/2+1...an) )

Var m:word;

Function Tob.Mxr(L,R:word):extended;

Var zL,zR:extended;

begin

if L=R then Mxr:=a[R]

Else begin m:=(L+R) div 2;

zL:=Mxr(L,m); zR:=Mxr(m+1,R);

If zL>zR then Mxr:=zL

else Mxr:=zR;

end;

end;

02.07.19

33

Найти номер max делением пополам

max(a1..an)= max (max (a1...an/2), max (an/2+1...an) )

Function Tob.Mxri(L,R):word;

var i,j:word;

begin

if L=R then Mxri:=R

else begin m:=(L+R) div 2;

i:=Mxri(L,m);

j:=Mxri(m+1,R);

If a[i]>a[j] then Mxri:=i

else Mxri:=j ;

end;

end;

02.07.19

34

Работа с методами класса Tob

Uses …,unit2;

procedure TForm1.Button1Click(Sender: TObject);

Var ob:Tob; n:word; mxa:extended;

begin

n:=strtoint(edit1.Text);

Ob:=Tob.create;

Ob.reda(stringgrid1,n);

Mxa:=ob.Mxr(1,n);

Nmxa:=ob.Mxri(1,n);

ob.free;

edit2.Text:=floattostrf(Mxa,fffixed,5,1);

edit3.Text:=Inttostr(Nmxa);

end;

02.07.19

35

Замечание

Кажется заманчивым использовать напрямую рекурсивную конструкцию

max (max (a1...an/2), max (an/2+1...an) )

Function Tob.Mxri(L,R):word;

var

begin

if . . .

. . .

Mxri=Mxri(Mxri(L,m),Mxri(m+1,R));

end;

Однако она быстро приводит к переполнению стека

02.07.19

36

НОД

Рекуррентное соотношение

(следствие теоремы Евклида)

если M=N НОД(M,N)=M,

если M>N НОД(M,N)=НОД(M-N, N),

если M<N НОД(M,N)=НОД(M, N-M),

Function NOD(m,n);

begin

if m=n then NOD:=m

else if m>n then

NOD:=NOD(m-n,n)

 

else

NOD:=NOD(m,n-m)

;

end;

 

 

02.07.19

37

Особенности выполнения рекурсивной подпрограммы

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

В вышеприведенных примерах: при i=0 или i=1.

При обратном переходе от полученного тривиального решения

крешению для заданного i=n выполняется решение последовательности элементарных подзадач с нарастанием i (или убыванием)

02.07.19

38

Особенности выполнения

При каждом переходе к следующему уровню (рекурсивной активации процедуры) происходит запоминание всех ее локальных и формальных параметров.

В результате после n-й активации в памяти будет находиться список из n+1 комплектов таких параметров.

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

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

02.07.19

39

Особенности выполнения

Рекурсивная версия программы алгоритма выполняется медленнее чем, например, итерационная и может привести к исключительной ситуации EStackOverFlow – переполнение программного стека.

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

При написании функции нахождения максимального значения в стек заносятся значения L,R,zL, zR.

02.07.19

40