
- •Основы Алгоритмизации и Программирования
- •Цели :
- •Литература
- •Методические пособия
- •Тема 1 Программирование с
- •Рекуррентные соотношения и стратегии решения задачи разбиением ее на подзадачи
- •• Определение 1.
- •Определение 2.
- ••Любое правильное рекуррентное уравнение при задании начального условия описывает некую счетную бесконечную последовательность
- •Примеры описания объектов с помощью рекуррентных уравнений
- •Примеры описания объектов с помощью рекуррентных уравнений
- •Примеры описания объектов с помощью рекуррентных уравнений
- ••Все выше приведенные определения являются рекурсивными, т.е. представляют объект соотношением, выражающим объект через
- ••В общем виде рекурсивный алгоритм P можно
- •Решать задачу рекурсивно (т.е. составить рекурсивный алгоритм)
- •Вычисление n-го числа Фиббоначи
- •Две стратегии разбиения на подзадачи
- •Стратегия
- •Недостаток стратегии РиВ
- •Стратегия
- •Суть стратегии ДП
- •Программирование рекуррентных соотношений
- •Вычисление n!
- •Найдем максимум a1...an
- •Нахождение max(a1..an) (как метод класса)
- •Нахождение max(a1..an)
- ••Итерация - от человека.
- •Класс c методом ввода массива
- •Найти max делением пополам
- •Найти номер max делением пополам
- •Работа с методами класса Tob
- •Замечание
- •Особенности выполнения рекурсивной подпрограммы
- •Особенности выполнения
- •Особенности выполнения
- •Рекурсивный вызов может быть прямым,
- •Организация выхода из рекурсии
- •Условия окончания рекурсии
- •О целесообразности использования рекурсивных подпрограмм
- •Неподходящий пример
- •Решение с помощью итерационного алгоритма по стратегии динамического программирования
- •рекомендация
- •Задача о Ханойской башне
- •Ханойская башня
- •Ханойская башня из 2 дисков
- •Ханойская башня из n дисков
- •Рекурсивный алгоритм
- •Рекурсивная подпрограмма
- •Hanoi(3,1,2,3) вызовет следующее дерево активаций и печати
- •результат
- •Три диска
- •Функция Аккермана
- •Матрица Аккермана
- •Рекурсивная функция
- ••procedure TForm1.Button1Click(Sender: TObject);
- •Правила выбора программной реализации рекуррентных соотношений
- •если возникающие подзадачи на каждом шаге независимы, то каждая из них будет решаться
- ••Контрольные вопросы
- •Задачи для контроля
- •Задачи для контроля
- •Конец темы 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 |