Лекции по проге / 16_Рекурсия
.pdf
Лекция №16. Рекурсия
● Рекурсия
–Понятие рекурсивной функции
–Условия применения рекурсии
–Пример рекурсивного алгоритма
1
Рекурсия
Рекурсивной называется функция, которая явно (в своем теле)
или неявно (через другие функции)
вызывает сама себя
2
Задание
Факториал числа n>1 (n!) может быть вычислен по формуле
n!=n*(n-1)! Зная, что факториал 1 равен 1 напишите рекурсивную функцию fact, возвращающую факториал целого числа, переданного ей как параметр
3
Рекурсивная функция вычисления факториала
int fact(int n)
{
if(n==1) return 1;
else
return n*fact(n-1);
}
4
Когда НЕ применять рекурсию
●Рекурсию не следует применять, если ее
можно заменить простым циклом:
int fact(int n)
{
int fac=1;
for(int i=2;i<=n;i++) fac=fac*i;
return fac;
}
5
Когда НЕ применять рекурсию
●Рекурсию категорически не следует применять, если вызов функции с одними и теми же параметрами будет происходить неоднократно.
●Пример: числа Фиббоначчи начинаются с двух единиц, каждое следующее число в ряду равно
сумме двух предыдущих
int fibb(int n)
{
if(n<3) return 1;
else
return fibb(n-1)+fibb(n-2);
6}
|
Вычисление fibb(6) |
|
||
|
|
fibb(6) |
|
|
|
fibb(5) |
|
fibb(4) |
|
fibb(4) |
fibb(3) |
fibb(3) |
fibb(2) |
|
fibb(3) fibb(2) fibb(2) fibb(1) |
fibb(2) fibb(1) |
|||
fibb(2) |
fibb(1) |
|
|
|
7 |
|
|
|
|
Условия применения рекурсии
● Рекурсию следует применять, если сложный алгоритм можно представить как набор состояний, задаваемых параметрами, при этом действия в каждом состоянии описываются инструкцией, включающей переход в другие состояния.
●Необходимо убедится в конечности цепочки рекурсивных вызовов.
8
Задача заливки замкнутой области
●Дан двумерный массив, заполненный нулями и единицами, а также координаты одной из его клеток со значением 0
●Задача: заполнить двойками замкнутую область из нулей произвольной формы, ограниченную единицами.
●Вход: Paint — двумерный массив целых чисел; x0,y0 — координаты клетки в нем.
●Выход: Paint — двумерный массив целых чисел.
9
Обобщающий тестовый пример
0 1 2 3 4 5x |
0 1 2 3 4 5x |
||
0 1 1 1 1 1 0 |
0 1 1 1 1 1 0 |
||
1 1 0 0 0 1 0 |
1 1 2 2 2 1 0 |
||
2 1 0 0 1 1 0 |
2 1 2 2 1 1 0 |
||
3 1 0 1 1 0 0 |
3 1 2 1 1 0 0 |
||
4 1 |
0 |
0 1 1 1 |
4 1 2 2 1 1 1 |
5 1 0 0 0 0 1 |
5 1 2 2 2 2 1 |
||
6 1 1 0 0 1 1 |
6 1 1 2 2 1 1 |
||
7 0 1 0 0 1 0 |
7 0 1 2 2 1 0 |
||
8 0 1 0 0 1 0 |
8 0 1 2 2 1 0 |
||
y |
|
|
y |
y0=4, x0=1 |
|
||
10
