Рекурсия. Метод решения задач

Содержание

Слайд 2

Определения Рекурсивным называется объект, частично содержащий себя, или определенный с помощью самого себя.

Определения

Рекурсивным называется объект, частично содержащий себя, или определенный с помощью самого

себя.
Слайд 3

Рекурсивные определения Натуральные числа: 0 – натуральное число Если N –

Рекурсивные определения

Натуральные числа:
0 – натуральное число
Если N – натуральное число, то

число N+1 также натуральное
Слайд 4

Рекурсивные определения Факториал числа: 0!=1 N!=(N-1)!*N, для любого N>0;

Рекурсивные определения

Факториал числа:
0!=1
N!=(N-1)!*N, для любого N>0;

Слайд 5

Достоинство Рекурсивное определение позволяет определить бесконечное множество объектов с помощью конечного высказывания

Достоинство

Рекурсивное определение позволяет определить бесконечное множество объектов с помощью конечного высказывания

Слайд 6

Рекурсия в программировании С помощью конечной рекурсивной программы можно описать бесконечное

Рекурсия в программировании

С помощью конечной рекурсивной программы можно описать бесконечное вычисление,

причем программа не будет содержать явных повторений
Слайд 7

Рекурсивные функции Если некоторая подпрограмма (функция) содержит явную ссылку на саму

Рекурсивные функции

Если некоторая подпрограмма (функция) содержит явную ссылку на саму себя,

то ее называют прямо-рекурсивной
Если подпрограмма P ссылается на другую подпрограмму Q, которая содержит ссылку на P, то такую подпрограмму называют косвенно-рекурсивной
Слайд 8

Рекурсия Рекурсия сводит решение задачи к решению более мелких идентичных задач

Рекурсия

Рекурсия сводит решение задачи к решению более мелких идентичных задач
Сложные задачи

могут иметь простые рекурсивные решения
Не всегда рекурсивный метод решения лучше итеративного (основанного на использовании циклов)
Слайд 9

Факториал числа Рекурсивное определение: Fact(int n) { if(n==0) return 1; else return (Fact(n-1)); }

Факториал числа

Рекурсивное определение:
Fact(int n)
{ if(n==0) return 1;
else return (Fact(n-1));
}

Слайд 10

Факториал числа: итеративное определение long Factorial (int n) { int i;

Факториал числа: итеративное определение

long Factorial (int n)
{ int i;
long f;
if

(n==0) return 1;
else
for(i=1;i<=n;i++) f=f*I;
return (f);
}
Слайд 11

Рекурсивное решение При вызове подпрограммы всякий раз создаются новые экземпляры локальных

Рекурсивное решение

При вызове подпрограммы всякий раз создаются новые экземпляры локальных переменных
При

этом не возникает никаких конфликтов при использовании имен
Слайд 12

Рекурсивное решение: факториал числа 5 return (5*Fact(4)) 5*4*3*2 return (4*Fact(3)) 4*3*2

Рекурсивное решение: факториал числа 5

return (5*Fact(4))
5*4*3*2

return (4*Fact(3))
4*3*2

return (3*Fact(2))
3*2

return (2*Fact(1))
2*1

return (1*Fact(0))
1*1

return (1)

Слайд 13

Свойства рекурсивного решения Функция вызывает саму себя При каждом вызове функции

Свойства рекурсивного решения

Функция вызывает саму себя
При каждом вызове функции решается идентичная,

но меньшая задача
Одна из подзадач решается иначе, чем другие : в итоге одна из подзадач является базовой
Проверка базисных условий позволяет остановить процесс рекурсии
Слайд 14

Ошибка в использовании рекурсии Отсутствие базиса: void PRINT() { cout PRINT();

Ошибка в использовании рекурсии

Отсутствие базиса: void PRINT()
{ cout<<‘*’;
PRINT();
}
При вызове данной функции

процесс вывода никогда не закончится, т.к. отсутствует базис
Слайд 15

Четыре вопроса о рекурсивном решении: Как свести задачу к идентичным задачам

Четыре вопроса о рекурсивном решении:

Как свести задачу к идентичным задачам меньшего

размера?
Как уменьшать размер задачи при каждом рекурсивном вызове
Какая задача является базовой
Можно ли достичь базиса, постоянно уменьшая размер задачи?
Слайд 16

Числа Фибоначчи F(n)=F(n-1)+F(n-2) Необходимо 2 базиса:F(1)=1, F(2)=1; int F(int n) {

Числа Фибоначчи

F(n)=F(n-1)+F(n-2)
Необходимо 2 базиса:F(1)=1, F(2)=1;
int F(int n)
{ if (n<=2) return 1;

else return F(n-1)+F(n-2);
}
Слайд 17

Задача о параде Необходимо на параде расставить k оркестров и m

Задача о параде

Необходимо на параде расставить k оркестров и m платформ,

так, чтобы никакие два оркестра не стояли рядом.
Сколькими способами можно расставить оркестры и платформы, если их всего N штук.
Слайд 18

Задача о параде Допустим, что у нас есть N оркестров и

Задача о параде

Допустим, что у нас есть N оркестров и N

платформ
Будем считать, что варианты оркестр-платформа и платформа-оркестр – различны
Парад может закрываться либо платформой, либо оркестром
Слайд 19

Задача о параде Введем обозначения: P(n)- количество вариантов организации парадов длиной

Задача о параде

Введем обозначения:
P(n)- количество вариантов организации парадов длиной n
F(n)-количество вариантов

организации парадов длиной n, завершающихся платформой
B(n) - количество вариантов организации парадов длиной n, завершающегося оркестром
Тогда P(n)=F(n)+B(n)
Слайд 20

Задача о параде F(n)=P(n-1) – парад, завершающийся платформой длины n получается

Задача о параде
F(n)=P(n-1) – парад, завершающийся платформой длины n получается из

парада длиной n-1, завершающийся оркестром
B(n)=F(n-1) – если парад заканчивается оркестром, значит перед ним стоит платформа
Таким образом получаем: B(n)=P(n-2)
P(n)=P(n-1)+P(n-2)
Слайд 21

Задача о параде Базис: P(1)=2-парад длины один может состоять либо из

Задача о параде

Базис:
P(1)=2-парад длины один может состоять либо из платформы, либо

из оркестра
P(2)=3- парад длины 2 может состоять из:
Платформы и оркестра
Двух платформ
Двух оркестров
Слайд 22

Дилемма мистера Спока Сколько разных способов можно применить для исследования k

Дилемма мистера Спока

Сколько разных способов можно применить для исследования k планет,

если солнечная система состоит из n планет (с(n,k))
Слайд 23

Рассуждения мистера Спока Есть две возможности: Либо мы посещаем некоторую планету

Рассуждения мистера Спока

Есть две возможности:
Либо мы посещаем некоторую планету Х и

тогда другие k-1 можно выбрать из оставшихся n-1 планет
Либо мы игнорируем планету Х и тогда из остальных n-1 планет можно выбрать k планет
Слайд 24

Получаем формулу: c(n,k)=c(n-1,k-1)+ c(n-1,k), где c(n-1,k-1) – количество групп, состоящих из

Получаем формулу:

c(n,k)=c(n-1,k-1)+ c(n-1,k), где
c(n-1,k-1) – количество групп, состоящих из k планет,

включающих планету X
c(n-1,k) - количество групп, состоящих из k планет, не включающих планету X
Слайд 25

Базис: c(k,k)=1 – можно выбрать только одну группу, состоящую из всех

Базис:

c(k,k)=1 – можно выбрать только одну группу, состоящую из всех планет
c(n,0)=1

– есть только одна группа, не содержащая ничего
c(n,k)=0, если k>n
Слайд 26

Разложение числа на слагаемые Сколькими способами можно разбить число M на

Разложение числа на слагаемые

Сколькими способами можно разбить число M на слагаемые
Обозначим

число разбиений P(M)
Введем новую функцию Q(M,N) – количество разбиений числа M на слагаемые <=N
Слайд 27

Разложение числа на слагаемые Q(M,1)=1 – только одним способом можно представить

Разложение числа на слагаемые

Q(M,1)=1 – только одним способом можно представить число

М с помощью 1: 1+1+….+1
Q(1,N)=1 – число один можно разложить на слагаемые только одним способом, независимо от N
Q(M,N)=Q(M,M), M