Информатика,  Материалы

Задача №11. Использование рекурсивных алгоритмов.

Рекурсия — это способ определения объектов (понятий), при котором определение объекта строится, опираясь на само понятие объекта.

Для того, чтобы задать рекурсию, необходимо описать:

— условие остановки рекурсии (базовый случай);

— рекуррентную формулу.

В программировании если процедура вызывает сама себя, то, по сути, это приводит к повторному выполнению содержащихся в ней инструкций, что аналогично работе цикла. Рекурсия позволяет заменить цикл и в некоторых сложных задачах делает решение более понятным, хотя часто менее эффективным.

Некоторые языки программирования не содержат циклических конструкций вовсе, предоставляя программистам организовывать повторения с помощью рекурсии (например, Пролог, где рекурсия — основной прием программирования).

Классическим примером рекурсивного алгоритма является описание вычисления факториала:

где F(n-1)=(n-1)!

Рекурсивные алгоритмы вычисления одной функции

Пример 1.

Ал­го­ритм вы­чис­ле­ния зна­че­ния функ­ции F(n), где n – на­ту­раль­ное число, задан сле­ду­ю­щи­ми ре­кур­рент­ны­ми со­от­но­ше­ни­я­ми:

F(n) = 1 при n = 1;

F(n) = F(n − 1) · n при n ≥ 2.

Чему равно зна­че­ние функ­ции F(6)?

В от­ве­те за­пи­ши­те толь­ко на­ту­раль­ное число.

Решение:

По­сле­до­ва­тель­но на­йдём зна­че­ния функции от базового случая F(1) до искомого значения F(6):

F(1) = 1

F(2) = 2

F(3) = 6

F(4) = 24

F(5) = 120

F(6) = 720

Ответ:720

Рекурсивные алгоритмы вычисления нескольких функций

Пример 2.

Алгоритм вычисления значений функций F(n) и G(n), где n – натуральное число, задан следующими соотношениями:

F(1) = 1; G(1) = 1;

F(n) = F(n–1) – G(n–1),

G(n) = F(n–1) + 2*G(n–1), при n >=2

Чему равно значение величины F(5)/G(5)? В ответе запишите только целое число.

Решение:

По­сле­до­ва­тель­но на­йдём зна­че­ния функций от базового случая F(1), G(1) до искомых значений F(5), G(5):

F(1) = 1; G(1) = 1;

F(2) = F(1) – G(1) = 1 – 1 = 0;

G(2) = F(1) + 2*G(1) = 1+2 = 3;

F(3) = F(2) – G(2) = 0 – 3 = -3;

G(3) = F(2) + 2*G(2) = 0+6 = 6;

F(4) = F(3) – G(3) = -3 – 6 = -9 ;

G(4) = F(3) + 2*G(3) = -3+12 = 9;

F(5) = F(4) – G(4) = -9 – 9 = -18;

G(5) = F(4) + 2*G(4) = -9+18 = 9.

F(5)/G(5) = -18/9 = -2

Ответ:-2

Рекурсивные алгоритмы выполнения процедур

Пример 3.

Ниже на пяти язы­ках про­грам­ми­ро­ва­ния за­пи­сан ре­кур­сив­ный ал­го­ритм F.

Бей­сикPython
SUB F(n)PRINT nIF n < 5 THENF(n + 1)F(n + 3)END IFEND SUBdef F(n):print(n)if n < 5:F(n + 1)F(n + 3)
Пас­кальАл­го­рит­ми­че­ский язык
procedure F(n: integer);beginwriteln(n);if n < 5 thenbeginF(n + 1);F(n + 3)endendалг F(цел n)начвывод n, нсесли n < 5 тоF(n + 1)F(n + 3)всекон
Си
void F(int n){printf(«%d\n», n);if (n < 5) {F(n + 1);F(n + 3);}}

Чему равна сумма всех чисел, на­пе­ча­тан­ных на экра­не при вы­пол­не­нии вы­зо­ва F(1)?

Решение:

Выпишем последовательно все действия, которые выполнят запускаемые процедуры:

F(1) выполнит следующие действия: Вывод числа 1, F(2), F(4)

F(2) выполнит следующие действия: Вывод числа 2, F(3), F(5)

F(4) выполнит следующие действия: Вывод числа 4, F(5), F(7)

F(3) выполнит следующие действия: Вывод числа 3, F(4), F(6)

F(5) выполнит следующие действия: Вывод числа 5

F(5) выполнит следующие действия: Вывод числа 5

F(7) выполнит следующие действия: Вывод числа 7

F(4) выполнит следующие действия: Вывод числа 4, F(5), F(7)

F(6) выполнит следующие действия: Вывод числа 6

F(5) выполнит следующие действия: Вывод числа 5

F(7) выполнит следующие действия: Вывод числа 7

Просуммируем все числа, выведенные на экран: 1+2+4+3+5+5+7+4+6+5+7 = 49

Ответ: 49

Пример 4.

Ниже на пяти язы­ках про­грам­ми­ро­ва­ния за­пи­са­ны две ре­кур­сив­ные функ­ции (процеду­ры): F и G.

1

Сколь­ко сим­во­лов «звёздоч­ка» будет на­пе­ча­та­но на экра­не при вы­пол­не­нии вы­зо­ва F(11)?

Решение:

Выпишем последовательно все действия, которые выполнят запускаемые процедуры:

F(11)  G(10) * F(7) G(6) * F(3) G(2) * F(-1)

Всего на экране будет напечатано 3 «звездочки».

Ответ: 3

Пример 7.36.

Дан рекурсивный алгоритм:

procedure F(n: integer);

begin

 writeln(‘*’);

 if n > 0 then begin

   F(n-3);

   F(n-2);

   F(n div 2);

   F(n div 2);

 end

end;

Сколько символов «звездочка» будет напечатано на экране при выполнении вызова F(6)?

Решение:

Для наглядности изобразим схему работы алгоритма в виде дерева:

Причем, распишем до конца каждое значение F(n)  только один раз. Например, расписав один раз F(1), мы видим, что она напечатает в результате 5 звездочек. Т.е. F(1) = 5.

Проанализировав дерево, видим, что

F(0) = 1

F(2) = 3 + 2*F(1) = 13

F(3) = 1 + F(0) + 3*F(1) = 1 + 1 + 15 = 17

F(4) = 1 + F(1) + 3*F(2) = 1 + 5 + 3*13 = 45

F(6) = 1 + 3*F(3) + F(4) = 1 + 3*17 + 45 = 46 + 51 = 97

Ответ: 97

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *