
- •Основы Алгоритмизации и Программирования
- •Цели :
- •Литература
- •Методические пособия
- •Тема 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 |
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 |