Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 16_Рекурсия

.pdf
Скачиваний:
31
Добавлен:
14.03.2016
Размер:
117.24 Кб
Скачать

Лекция №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