Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_18_Рекурсия .ppt
Скачиваний:
27
Добавлен:
11.05.2015
Размер:
388.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