Скачать презентацию Чернышев Георгий Рекурсия и итерация Рекурсия Реку Скачать презентацию Чернышев Георгий Рекурсия и итерация Рекурсия Реку

Рекурсия и итерация.pptx

  • Количество слайдов: 45

Чернышев Георгий Рекурсия и итерация Чернышев Георгий Рекурсия и итерация

Рекурсия Реку рсия — метод определения класса объектов или методов предварительным заданием одного или Рекурсия Реку рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса или метода, ссылающегося прямо или косвенно на эти базовые случаи. -Wikipedia Другими словами, рекурсия — способ общего определения множества объектов или функций через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи. -Wikipedia В Паскале процедуры и функции могут вызывать сами себя, то есть обладать свойством рекурсивности.

Рекурсия Базовый случай Сведение к подзадаче Рекурсия Базовый случай Сведение к подзадаче

Рекурсия: пример PROCEDURE REVERSE (N: integer); Begin Write (N mod 10); If (N Div Рекурсия: пример PROCEDURE REVERSE (N: integer); Begin Write (N mod 10); If (N Div 10)<>0 Then REVERSE (N Div 10) END; 45387 7 REVERSE(4538) 8 REVERSE(453) 3 REVERSE(45) 5 REVERSE(4) 4 REVERSE(4) ---------------- Begin WHILE (N div 10 > 0) Begin Write (N mod 10); N : = N div 10; END;

Рекурсия: пример 1 1 2 3 5 8 13 21 34 55 FUNCTION FIB(N: Рекурсия: пример 1 1 2 3 5 8 13 21 34 55 FUNCTION FIB(N: INTEGER): INTEGER BEGIN IF (N = 1 OR N = 0) RETURN 1; FIB : = FIB(N - 1) + FIB(N - 2); END; ----------------VAR TMP, P 1, P 2: INTEGER; BEGIN P 1 : = 1; P 2 : = 1; IF ((N = 1) OR (N = 0)) FIB : = 1; FOR i : = 1 TO N-2 BEGIN TMP : = P 1; P 1 : = P 2 + P 1; P 2 : = P 1; END; FIB : = P 1; END;

Косвенная рекурсия Все что было выше – прямая рекурсия Косвенная: Рекурсивная цепочка вызовов функций Косвенная рекурсия Все что было выше – прямая рекурсия Косвенная: Рекурсивная цепочка вызовов функций При объявлении функций нужно использовать директиву forward FUNCTION B(X: INTEGER): REAL; FORWARD; FUNCTOIN A(Y: INTEGER): REAL;

Альтернативы в реализации Итерация Ограничение глубины Предвычисление Глобальные переменные Альтернативы в реализации Итерация Ограничение глубины Предвычисление Глобальные переменные

Сложности Бесконечная глубина Исчерпание стека Сложности Бесконечная глубина Исчерпание стека

Рекурсия (+) Наглядность, простота в реализации Ниша – оценивание позиций в играх, ИИ (перебор) Рекурсия (+) Наглядность, простота в реализации Ниша – оценивание позиций в играх, ИИ (перебор) (-) Медленно, исключение – функциональные ЯП Дорого (создается последовательность стеков вызов)

Задачи Для зачета за эту тему надо набрать 3 балла Задачи без * считаются Задачи Для зачета за эту тему надо набрать 3 балла Задачи без * считаются за 1 балл Задачи со * и ** считаются соответственно за 2 и 3 балла Некоторые задачи имеют дополнения в условиях, при которых их ценность повышается. Для зачета этого типа задач необходимо предъявить оба варианта (и простой вариант тоже)

Задача – “Поворот массива” Дан массив С помощью рекурсии перевернуть его (поменять местами первый Задача – “Поворот массива” Дан массив С помощью рекурсии перевернуть его (поменять местами первый элемент с последним, второй с предпоследним итд)

Задача – “Звездная пыль” В некоторой организации, в целях безопасности, задумали замену порядковых номеров Задача – “Звездная пыль” В некоторой организации, в целях безопасности, задумали замену порядковых номеров персонала (трехзначных, целых) Хакерам удалось узнать схему переназначения Суть схемы – в многоразовом применении некоторых операций Операции: ▪ Прибавление к номеру 123 по модулю 1000 ▪ Умножение номера на 3 по модулю 1000 У хакеров есть список всех трехзначных номеров до замены и гарантии что при переназначении было использовано не более N операций Узнать, есть ли шанс, что сотрудник, с известным номером является старым (присутствующим в старой базе номеров персонала) Подсказка: применяя рекурсию обойти “назад” возможные номера

Задача – “Минуту еще” Две последовательности: Xn = Yn-1 + Yn-2, X 0 = Задача – “Минуту еще” Две последовательности: Xn = Yn-1 + Yn-2, X 0 = X 1 = 1 Yn = Xn-1 + Xn-2, Y 0 = 1 Y 1 =2 Вычислить рекурсивно и итеративно Xk элемент

Задача – “Круг” Последовательности: Xn = Yn-1 + Yn-2, X 0 = X 1 Задача – “Круг” Последовательности: Xn = Yn-1 + Yn-2, X 0 = X 1 = 1 Yn = Xn-1 + Xn-2, Y 0 = 1 Y 1 =2 Zn = Xn-1 + Yn-2 Вычислить рекурсивно и итеративно Zk элемент

Задача – “Треугольник” Вычислить рекурсивно N строчку треугольника Паскаля Вычислить ее с применением итерации Задача – “Треугольник” Вычислить рекурсивно N строчку треугольника Паскаля Вычислить ее с применением итерации Замерить время, посмотреть что быстрее Использовать Dos. Get. Time

Задача – “SAT проблема” Дана булева формула с N переменными Переменные объединены связками AND, Задача – “SAT проблема” Дана булева формула с N переменными Переменные объединены связками AND, OR, NOT Проверить, есть ли набор таких переменных, что формула принимает значение true Использовать рекурсию Если сделать еще и итеративно, замерить время, понять почему разница не велика, то класс задачи повышается

Задача – “Перестановки” Сгенерировать все перестановки из набора 1, 2, 3, …, N С Задача – “Перестановки” Сгенерировать все перестановки из набора 1, 2, 3, …, N С помощью рекурсии Если удастся сделать и без использования, то дополнительные баллы Замерить время для различных N

Задача – “Фрактал” Нарисовать в графике любой известный фрактал С помощью рекурсивных вызовов Фрактал Задача – “Фрактал” Нарисовать в графике любой известный фрактал С помощью рекурсивных вызовов Фрактал согласовать заранее

Задача – “Бинарное дерево” Бинарное дерево каждый узел имеет 2 потомка значение в левом Задача – “Бинарное дерево” Бинарное дерево каждый узел имеет 2 потомка значение в левом потомке меньше значения в корневом узле значение в правом потомке больше значения в корневом узле Проверить наличие элемента X в дереве Рекурсивно и Итеративно, замерять время Дерево хранить как динамическую структуру или как массив где позиции левого потомка 2*x а правого 2*x+1

Задача – “Ферзи” На шахматной доске N*N расставить N ферзей так, чтобы они не Задача – “Ферзи” На шахматной доске N*N расставить N ферзей так, чтобы они не били друга Если сделать и с помощью итерации, то класс задачи повышается

Задача – “Игра в 8” Дана доска 3*3, играем по правилам игры в 15 Задача – “Игра в 8” Дана доска 3*3, играем по правилам игры в 15 Решить перемешанную комбинацию Если комбинация неверна (да, таких столько же!), определить это Если решили и итерационно – дополнительные баллы Если итерационно решили так, что 4*4 работает быстро то **

Задача – “Рюкзак” Дано Размер рюкзака N Множество вещей: (o 1, w 1, p Задача – “Рюкзак” Дано Размер рюкзака N Множество вещей: (o 1, w 1, p 1), (o 2, w 2, p 2) … (on, wn, pn) Где каждой вещи соответствует вес w, стоимость p Найти наиболее дорогостоящую комплектацию рюкзака Рекурсией При каком количестве вещей задача становится не решаемой за разумное время? Итеративный алгоритм добавит баллов

Задача – “Расчет цепи” Дана схема состоящая из сопротивлений ri Рассчитать суммарное сопротивление цепи Задача – “Расчет цепи” Дана схема состоящая из сопротивлений ri Рассчитать суммарное сопротивление цепи Если сопротивления соединены последовательно, то сопротивления складываются Если параллельно то общее (r 1*r 2)/(r 1+r 2) Сопротивления заданы в виде рекурсивной динамической структуры, либо, массивов (на выбор)

Задача – “Свертка” Дан массив и функция от N переменных Рекурсивно вычислить левую свертку Задача – “Свертка” Дан массив и функция от N переменных Рекурсивно вычислить левую свертку от него. Свертка это f(…f(f(e 1, e 2, …, en 1), en 1+1, en 2+2, … e 2*n 1 -1)…)

Задача – “Детерминант” Вычислить рекурсивно детерминант матрицы Задача – “Детерминант” Вычислить рекурсивно детерминант матрицы

Задача* – “Бусинок мало” Есть наборы бусинок различных цветов: Красный (K штук) Синий (L Задача* – “Бусинок мало” Есть наборы бусинок различных цветов: Красный (K штук) Синий (L штук) Зеленый (M штук) Существуют правила: Синяя не может идти за красной Красная не может быть на четной позиции С помощью рекурсивной функции подсчитать сколько может быть собрано различных бус длины M, по данным правилам На место склейки – правила не распространяется

Задача* – “Не всех бусинок мало” Есть наборы бусинок различных цветов: Красный (K штук) Задача* – “Не всех бусинок мало” Есть наборы бусинок различных цветов: Красный (K штук) Синий (L штук) Зеленый (бесконечность) Существуют правила: Синяя не может идти за красной Красная не может быть на четной позиции Три зеленых подряд не может быть С помощью рекурсивной функции подсчитать сколько может быть собрано различных бус длины M, по данным правилам На место склейки – правила не распространяется

Задача* – “Бусы” Есть наборы бусинок различных цветов: Красный Синий Зеленый Существуют правила: Синяя Задача* – “Бусы” Есть наборы бусинок различных цветов: Красный Синий Зеленый Существуют правила: Синяя не может идти за красной Две красных подряд запрещены Зеленая может находиться только на 2^N позиции С помощью рекурсивной функции подсчитать сколько может быть собрано различных бус длины M, по данным правилам Считать что количество бусинок каждого цвета не ограничено На место склейки – правила не распространяется

Задача* – “Бусы-2” Есть наборы бусинок различных цветов: Красный Синий Зеленый Существуют правила: Синяя Задача* – “Бусы-2” Есть наборы бусинок различных цветов: Красный Синий Зеленый Существуют правила: Синяя не может идти за последовательностью [красная, зеленая] Две красных подряд запрещены Зеленая может находиться только после зеленой или на позиции 3^N С помощью рекурсивной функции подсчитать сколько может быть собрано различных бус длины M, по данным правилам Считать что количество бусинок каждого цвета не ограничено На место склейки – правила не распространяется

Задача* – “Подземелье без драконов” В подземелье без драконов встречаются следующие типы живности: Змей Задача* – “Подземелье без драконов” В подземелье без драконов встречаются следующие типы живности: Змей Лев Кит Встреча с врагами происходит в определенной последовательности, заданной У героя есть N хитпоинтов Если у героя кончаются хитпоинты то он решает что с него достаточно и уходит В каждый момент времени (встречу с монстром) герой может применить один объект. А может ничего не делать У героя есть набор объектов: Герою предстоит пройти подземелье напичканное врагами в поисках золота, что находится в конце ▪ ▪ ▪ Противоядие, A бутылок Кусок мяса, B штук Гарпун, C штук Встреча со: Змеем – дает состояние отравления; каждая дальнейшая встреча с живностью в состоянии отравления грозит потерей 1 хитпоинта. Противоядие снимает эффект, действует сразу же (можно применять на том же ходу) и теряется после применения Львом – потерю 2 хитпоинтов. Если отдать кусок мяса, то он теряет к герою интерес и штрафа нет Кита без гарпуна не пройти. После использования гарпун застревает и теряется. Подсказка: Рекурсивно проверять правила, параметры – экипировка, оставшиеся обитатели Проверить, сможет ли данный герой пройти данное подземелье с данным набором экипировки

Задача* – “Подземелье-2” Аналогично подземелью, но есть такие существа Варг (гигантский волк, кусает на Задача* – “Подземелье-2” Аналогично подземелью, но есть такие существа Варг (гигантский волк, кусает на 1 хитпоинт) Крокодил (кусает на N+1 хитпоинтов, где N – количество укусов “прошлыми” крокодилами) Вещи: Ордер на арест – помогает от Варга (теряется) Прокурорский запрос (тоже самое, но не теряется) Кусок мяса помогает от крокодила (не кусает на этом ходу) Бинты (обнуляют счетчик укусов) Даны Ni всех вещей, подземелье, N хитпоинтов, проверить можно ли его пройти в данной ситуации

Задача* – “Следопыт” Следопыт идет по лесу и на его пути встречаются различные местности Задача* – “Следопыт” Следопыт идет по лесу и на его пути встречаются различные местности Леса Реки Водопады Путь задан как последовательность местностей, а так же развилок (каждая развилка ведет к другой последовательности местностей). Считается что циклов нет, все пути ведут к цели. Проверить может ли следопыт придти к цели, при том что: Для того чтобы пройти реку нужна спичка чтобы развести костер и высушиться. Для водопада нужна веревка. Все предметы теряются после использования. Следопыт начинает путь с N спичек и M мотков веревки

Задача* – “Выражение” Дана строка содержащая в себе выражение в обратной польской записи Вычислить Задача* – “Выражение” Дана строка содержащая в себе выражение в обратной польской записи Вычислить его с использованием рекурсии Пример: (25 + 67)*2+77+25 +77, + 25, * + 25, 67, 2

Задача* – “Калькулятор” Дана запись содержащая Тип оператора Левый и правые операнды Операнды могут Задача* – “Калькулятор” Дана запись содержащая Тип оператора Левый и правые операнды Операнды могут быть как целыми числами, так и ссылками на другие такие записи Вычислить выражение

Задача* – “Крестики-Нолики” Дана позиция в игре крестики-нолики Поле 3*3 Определить, есть ли для Задача* – “Крестики-Нолики” Дана позиция в игре крестики-нолики Поле 3*3 Определить, есть ли для одного из игроков последовательность действий с гарантированной победой Использовать рекурсию

Задача* – “Слабое KD дерево” Реализовать дерево хранящее точки (1<X<M, 1<Y<N) плоскости в виде Задача* – “Слабое KD дерево” Реализовать дерево хранящее точки (1

Задача** - “Лабиринт” Дан лабиринт на плоскости, состоящий из N*N комнат в каждой комнате Задача** - “Лабиринт” Дан лабиринт на плоскости, состоящий из N*N комнат в каждой комнате может быть от 0 до 4 х дверей расположенных по различным сторонам света крайние комнаты дверей за пределы квадрата не имеют Найти путь из левого верхнего угла в правый нижний с помощью рекурсии Найти N когда стека вызовов будет не хватать.

Задача** – “Шашки” Дана шашечная позиция Размерность доски N*N количество шашек M Определить, есть Задача** – “Шашки” Дана шашечная позиция Размерность доски N*N количество шашек M Определить, есть ли всегда выигрышная стратегия у одного из игроков Использовать рекурсию, для расчета позиций Размер доски и количество шашек должно быть малым, но параметризовано Правило перехода в дамки можно игнорировать (снимать или переносить)

Задача** – “Поддавки” Условия те же что в задаче “Шашки”, но по правилам поддавков Задача** – “Поддавки” Условия те же что в задаче “Шашки”, но по правилам поддавков

Задача** – “CSP” Поле сапера N*M Дана правильная позиция Указать где мины все или Задача** – “CSP” Поле сапера N*M Дана правильная позиция Указать где мины все или частично Или указать что информации недостаточно, предоставить тогда кандидатов Работа с наборами булевых формул Подробнее – Петер Норвиг “Введение в ИИ”

Задача** – “Цивилизация” Дано игровое поле N*M Каждая клетка поля имеет стоимость передвижения (ландшафт) Задача** – “Цивилизация” Дано игровое поле N*M Каждая клетка поля имеет стоимость передвижения (ландшафт) Одному игроку даны K различных фигурок, с их местоположениями (Xi, Yi) Каждая фигурка имеет запас хода Fi Перемещение по диагонали – sqrt (сумма квадратов стоимостей) Второму игроку дана одна фигурка, с местоположением (0, 0) Этот игрок ходит первым При попадании на клетку с фигуркой противника – конец игры Проверить, успевает ли он дойти в (N, M)

Задача** – “Цивилизация-ИИ” Создать ИИ для задачи “Объекты. Цивилизация**” Перебирать на 4 -5 ходов Задача** – “Цивилизация-ИИ” Создать ИИ для задачи “Объекты. Цивилизация**” Перебирать на 4 -5 ходов полностью Два ИИ, желательно разных

Задача** – “Спички” Дано N спичек, их можно разложить не более чем на N Задача** – “Спички” Дано N спичек, их можно разложить не более чем на N кучек Вывести все разложения вычисленные Рекурсивно Итеративно

Задача** – “Цивилизация-ГЕКС” Тоже самое что цивилизация, но для гексагональной доски Задача** – “Цивилизация-ГЕКС” Тоже самое что цивилизация, но для гексагональной доски

Задача** – “Торговец-2” Дан граф городов и дорог Размер подобрать В городе Xi хотят Задача** – “Торговец-2” Дан граф городов и дорог Размер подобрать В городе Xi хотят купить вещей Gij за Cij, которая весит Wij Дан торговец, стартующий из города S Есть N тонн топлива, он обязан вернуться Грузоподъемность M Найти максимальную прибыль и нагрузку Задача очень вычислительно сложная, размеры всего надо подбирать