
- •Теоретический раздел лекции Тема 1. Программирование с использованием рекурсии
- •1.1. Cтратегии решения задачи разбиением ее на подзадачи
- •1.2. Программирование рекуррентных соотношений
- •Var z:extended;
- •1.3. Условия окончания рекурсии
- •1.4. О целесообразности использования рекурсии
- •Var I,X,y,z:word;
- •1.5 Правила выбора программной реализации рекуррентных соотношений
- •Тема 2. Задачи перебора вариантов
- •2.1. Модель дерева решений
- •2.2. Задача оптимального выбора (задача о рюкзаке)
- •2.3. Метод полного перебора двоичного дерева
- •Var wt,ct:extended;
- •Var j,k:byte;
- •If k in s then begin
- •Var j:byte;
- •Var j:byte;
- •Var wt1,oct1:byte;
- •2.4. Метод ветвей и границ
- •Var n,I:byte;
- •Var wt1,oct1:Extended;
- •Include(s,I);
- •If I in Sopt then writeln(I,a[I].W,a[I].C);
- •2.5. Эвристические методы
- •Тема 3. Поиск и сортировка массивов записей
- •3.1. Применимость сортировки и поиска
- •3.2. Массив записей и поиск в нем
- •Var m:word;
- •3.3. Сортировки массивов
- •Var c: mas; I,j,k:word;
- •Var m:word;
- •Var I,j:Word;
- •Var I,j,l,r:Word; X:Tk; w:Tzp;
- •Тема 4. Связанные списки с использованием рекурсивных данных
- •4.1. Список, стек, очередь
- •4.2. Списки на основе динамических массивов
- •Inherited create;
- •Var turn:Tlist; с1,c2:Tinf;
- •4.3. Рекурсивные данные и однонаправленные списки
- •Inherited create;
- •Var stec,st1,turn,tr1:Tlist; inf:Tinf;
- •4.4. Начальное формирование, добавление и удаление элементов однонаправленного списка
- •4.5. Разновидности связанных списков
- •Inf:Tinf;
- •Тема 5. Поиск и сортировки на связанных линейных списках
- •5.1. Поиск в однонаправленных списках
- •5.2. Сортировка однонаправленных списков
- •1 3Var Inf:tInf;
- •Тема 6. Использование линейных связанных списков
- •6.1. Вычисления арифметических выражений
- •Var ch,ch1,ch2,chr:char;
- •I:byte;ch,ch1:char;
- •6.2. Сложение больших целых чисел
- •Var u,V,s,t:byte;
- •6.3. Работа с разреженными матрицами
- •Inf:Tinf;
- •Inf:tInf;
- •Var proot,p:Ptree;
- •Var bl:boolean;
- •7.2. Бинарное дерево поиска
- •7.3. Основные операции с бинарным деревом поиска
- •Inf:tInf;
- •Var d1:Tree; c:Tinf; k:Tkey;
- •Var bl:Boolean;
- •Var m:Word;
- •Var p:Ttree; m:Word;
- •Тема 8. Хеширование
- •8.1. Что такое хеширование
- •8.2. Схема хеширования
- •Interface
- •Inf:Tinf;
- •8.4. Другие способы хеширования
- •Практический раздел Указания по выбору варианта
- •Индивидуальные практические работы и контрольные работы
- •Индивидуальная практическая работа №1. Программирование с использованием рекурсии
- •1.1. Понятие рекурсии
- •1.2. Порядок выполнения работы
- •1.2.1. Пример решения задачи
- •Индивидуальная практическая работа №2. Организация однонаправленного списка на основе рекурсивных типов данных в виде стека
- •2.1. Основные понятия и определения
- •Inf:tInf; // информация
- •Контрольная работа №1. Программирование с использованием деревьев на основе рекурсивных типов данных
- •1.1. Понятие древовидной структуры
- •Inf:tInf;
- •1.2. Компонент tTreeView
- •1.3. Бинарное дерево поиска
- •Основные операции с двоичным деревом поиска
- •1.4. Порядок написания программы
- •Inf:tInf;
- •Inherited Free;
- •Var tr:Ttree;
- •1.5. Индивидуальные задания
- •Курсовая работа
- •Литература
1.2. Порядок выполнения работы
Задание: Написать отдельный модуль, содержащий описание класса, в состав которого входят методы решения указанной задачи, необходимые поля и свойства класса (property). Написать основной модуль, содержащий описание экземпляра объекта класса, ввод исходных данных, обращение к методам класса и вывод результата в удобной форме.
Представить отчет, содержащий распечатку программы, описание рекурсивного (разбиение на тривиальные и элементарные подзадачи) и не рекурсивного алгоритмов задачи. Продемонстрировать работу программы, ответить на контрольные вопросы соответствующей лекции.
1.2.1. Пример решения задачи
Написать
программу вычисления
двумя методами. Один метод вычисляет
сумму без использования рекурсии, другой
с использованием рекурсии.
Листинг 1
Unit URecurs;
Interface
Type
Tzad1=class(Tobject)
s: extended;
Function srec(n:word):extended;
Function snotrec(n:word):extended;
end;
Implementation
Function Tzad1.srec;
begin
if n=1 then result:=4
else result:=srec(n-1)+sqr(n+1)/n;
end;
Function Tzad1.snotrec;
Var i:word;
begin
s:=0;
for i:=1 to n do
s:=s+sqr(i+1)/I;
result:=s;
end;
end. // Unit2;
Листинг 2
Unit Unit1;
…………………..
Uses URecurs;…………..
…………………..
var zad1:Tzad1;
begin
……….
zad1:=Tzad1.create;
x:=zad1.srec(N);
y:=zad1.snotrec (N);
Вывод x,y.
Zad1.free;
end.
1.3 Варианты задач
Решить поставленные задачи двумя способами – с применением рекурсии и без нее.
1.
Для заданного целого десятичного числа
Nполучить его представление
вp-ичной системе счисления
(p<10) в виде строки цифр.
2.
В упорядоченном массиве целых чисел
ai,i=1...nнайти номер элементаcметодом двоичного поиска, используя
очевидное соотношение: если,
тогда
иначе
.
Если элементcотсутствует в массиве то вывести
соответствующее сообщение.
3. Найти наибольший общий делитель чисел MиN. Используйте теорему Эйлера (алгоритм Евклида): ЕслиMделится наN,тоНОД (N, M)=N,иначеНОД (N, M)=НОД (M mod N, N).
4. Вычислить число Фибоначчи Fb(n). Числа Фибоначчи определяются следующим образом:Fb(0)=0; Fb(1)=1; Fb(n)=Fb(n-1)+Fb(n-2).
5. Решить задачу о Ханойской башне (см. лекцию1 рекурсия).
Имеются три стержня s1,s2,s2. На первом из них нанизаны n дисков различных диаметров, образующих правильную пирамиду чем выше расположен диск, тем меньше его диаметр. Требуется переместить всю башню на второй стержень, причем диски можно переносить по одному, нельзя помещать диск на диск меньшего диаметра, для промежуточного хранения можно использовать третий диск.
6.
Вычислить значение полинома степени n
по схеме,.
7.
Вычислить значение
,
используя рекуррентную формулу
,
в качестве начального приближения
использовать значениеx0=0.5(1+a).
8. Найти максимальный элемент в массиве a1...an, используя очевидное соотношениеmax (a1...an)=max (max (a1...an-1), an).
9. Найти максимальный элемент в массиве a1...an, используя соотношение (метод деления пополам)max (a1...an)=max (max (a1...an/2), max (an/2+1, an)).
10.
Вычислить
.
11.
Вычислить
12.
Вычислить произведение n2
(n-четное) сомножителей
13.
Вычислить
по следующему алгоритму:
,
еслиNчетное;
,
еслиNнечетное.
14.
Вычислить
.
15. Найти значение функции Аккермана A(m, n), которая определяется для всех неотрицательных целых аргументовmиnследующим образом:
A(o, n)=n+1;
A(m, o)=A(m-1, 1); (m>o); A(m, n)=A(m-1, A(m, n-1)); (m>o; n>o).