
- •Основы Алгоритмизации и Программирования
- •Цели :
- •Литература
- •Методические пособия
- •Тема 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
•procedure TForm1.Button1Click(Sender: TObject);
•var m,n,i,j:cardinal;
•begin
•stringgrid1.CleanupInstance;
•for i:=1 to 6 do begin
• |
stringgrid1.Cells[0,i]:=inttostr(i-1); |
• |
stringgrid1.Cells[i,0]:=inttostr(i-1); |
• |
end; |
•m:=strtoint(edit1.Text);
•n:=strtoint(edit2.Text);
•stringgrid1.ColCount:=n+2;
•stringgrid1.RowCount:=m+3;
•for i:=0 to m do
•for j:=0 to n do
•stringgrid1.Cells[j+1,i+1]:=inttostr(ak(i,j));
•end;
02.07.19 |
61 |
Правила выбора программной реализации рекуррентных соотношений
1 Записываем алгоритм решения некоторой задачи в виде рекуррентного соотношения, реализующего разбиение исходной задачи на подзадачи.
2 Объединяем одинаковые слагаемые в рекуррентном уравнении.
3 Если рекурсивная программа, реализующая рекуррентное соотношение, содержит один вызов рекурсивной функции, то рекурсивная реализация будет не эффективна (ее легко реализовать итерационно).
4 Если рекурсивная программа, реализующая рекуррентное соотношение, содержит более одного вызова рекурсивной функции (в этом случае итерационный алгоритм не всегда легко написать), то поступаем следующим образом:
02.07.19 |
62 |
если возникающие подзадачи на каждом шаге независимы, то каждая из них будет решаться только один раз и поэтому рекурсивная реализация оправдана, т. к. не приводит к повторному решению одной и той же подзадачи;
если возникающие подзадачи зависимы (например как в нахождении чисел Фибоначчи), то все зависит от того, помещаются ли все их решения в память:
•- если помещаются, то табличная реализация позволяет решить каждую подзадачу только один раз, запоминая ее решение в таблице; при повторном возникновении некоторой подзадачи она уже не решается повторно, а ее решение берется из таблицы;
•- если же решения зависимых подзадач не помещаются в память, то единственный выход при программной реализации
– рекурсия, конечно при условии, что она позволяет экономить память и сама может быть реализована с учетом доступной памяти (в этом случае важную роль играет глубина
рекурсии). |
63 |
02.07.19 |
•Контрольные вопросы
•Сформулируйте суть стратегии «разделяй и влавствуй».
•В чем отличие стратегии «динамического программирования» от стратегии разделяй и влавствуй.
•Как происходит реализация рекурсивной процедуры и какие параметры при этом заносятся в стек?
•Как организовать завершение рекурсивной процедуры?
•Когда рекурсия нецелесообразна и почему?
02.07.19 |
64 |
Задачи для контроля
•№1
•В упорядоченном по ключу массиве записей {a[i].f,
a[i].k} (f – фамилия; к - учетный номер) найти и выдать в окошко TEdit информацию из ячейки, содержащей заданный ключ х.
• |
Алгоритм двоичного поиска в виде рекурсивной |
|
функции оформить в отдельном модуле Unit2 как |
|
метод класса. Ввод исходного массива записей |
|
организовать из TStringGrid в модуле Unit1. |
02.07.19 |
65 |
Задачи для контроля
•№2
•Задача о ханойской башне.
•Алгоритм решения в виде рекурсивной процедуры
оформить в отдельном модуле Unit2 как метод класса. Ввод количества дисков из окошка TEdit и
вывод результатов в TMemo организовать в модуле
Unit1
02.07.19 |
66 |
Конец темы 1
Задавайте Ваши вопросы
02.07.19 |
67 |