Файл: Понятия рекурсии. Рекурсивные функции по дисциплине Алгоритмы и структуры данных.docx

ВУЗ: Не указан

Категория: Решение задач

Дисциплина: Не указана

Добавлен: 21.11.2023

Просмотров: 22

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Кафедра безопасности информационных систем

ОТЧЁТ

по практической работе №5 на тему:
«Понятия рекурсии. Рекурсивные функции»

по дисциплине «Алгоритмы и структуры данных»

Выполнил: студент группы ИБ-92вп Кадамов Ш.Ф.

«15» апреля 2021 г. ___________/Кадамов Ш.Ф./

Принял: к.ф.-м.н., доцент, И.А. Моисеев

«ХХ» апреля 2021 г. ___________/ И.А. Моисеев /

САНКТ-ПЕТЕРБУРГ

2021

Цель работы



Цель работы: изучить понятия рекурсии, рекурсивные функции в программировании, приемы построения рекурсивной триады при решении задач, научиться применять рекурсивные методы в решении задач на языке С++.
Задачи:
Задача 1.

Определите закономерность формирования членов последовательности. Найдите n -ый член последовательности: 1, 1, 2, 3, 5, 8, 13, ...

Задача 2.

Разработать алгоритм и программу вычисления числа сочетаний из n элементов по m:

Числа n и m вводятся с клавиатуры (n m). Решить задачу рекурсивно, выразив вычисление
через

Задача 3.

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

Задача 4.

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

21=>8+1=9=>729=>343+8+729=1080=1+512=513=>153

Задача 5.

Исполнитель умеет выполнять два действия: "+1", "*2". Составьте рекурсивную функцию для программы получения из числа 1 числа 100 за наименьшее количество операций. Определить количество операций.

Результаты выполнения работы



Задача 1
#include

using namespace std;
int main()

{

setlocale(LC_ALL, "Russian");

int it;

int f0 = 0;

int f1 = 1;

int f;

cout << "Введите количество итераций:\n";

cin >> it;

cout << f0 + f1 << " ";

for (int i = 1; i < it; i++)

{

cout << f0 + f1 << " ";

f = f1;

f1 += f0;

f0 = f;

}

cout << "\nn -ый член последовательности = " << f1 << endl;

}
Скриншот 1:



Задача 2
#include

using namespace std;
int CB(int n, int m)

{

int c;

if (m > n / 2) m = n - m;

if (m == 1) return n;

if (m == 0) return 1;

if (n + m >= 90)

{

c = CB(n - 1, m);

c += CB(n - 1, m - 1);

}

else

{

c = 1;

for (int i = 1; i <= m; ++i)

{

c *= n - m + i;

c /= i;

}

}

return c;

}
int main()

{

setlocale(LC_ALL, "Russian");

int n, m;

cout << "Введите n: ";

cin >> n;

cout << "Введите m: ";

cin >> m;

if (n >= m)

cout << "\nКоличество сочетаний: " << CB(n, m) << endl;

}
Скриншот 2:



Задача 3
#include

using namespace std;
int recurs(int a, int b)

{

if (a != 0 && b != 0)

{

if (a > b)

{

a %= b;

recurs(a, b);

}

else

{

b %= a;

recurs(a, b);

}

}

else

{

return a + b;

}

}
int iter(int a, int b)

{

for (int i = 0; i < a + b; i++)

{

if (a != 0 && b != 0)

{

if (a > b)

{

a %= b;

}

else

{

b %= a;

}

}

else

{

return a + b;

}

}

}
int main()

{

setlocale(LC_ALL, "Russian");

int n, m;

cout << "Введите первое натуральное число: ";

cin >> n;

cout << "Введите второе натуральное число: ";

cin >> m;

cout << "\nНОД с помощью рекурсивного алгоритма = " << recurs(n, m) << endl;

cout << "НОД с помощью итерационного алгоритма = " << iter(n, m) << endl;

}

Скриншот 3:



Задача 4
#include

using namespace std;
int kub(int n)

{

int C = 0;

if (n >= 10)

{

C += kub(n / 10);

}

int a = n % 10;

C += a * a * a;

return C;

}
int main()

{

setlocale(LC_ALL, "Russian");

int b;

cout << "Введите число кратное 3-ём: ";

cin >> b;

cout << endl << b;

if ((b % 3) == 0)

{

while (b != 153)

{

b = kub(b);

cout << " --> " << b;

}

}

cout << endl;

}
Скриншот 4:



Скриншот 5:


Скриншот 6:



Задача 5
#include

using namespace std;
int recurs(int a)

{

int b = 1;

if (a != 1)

{

if ((a % 2) == 0)

{

a /= 2;

b += recurs(a);

}

else

{

a -= 1;

b += recurs(a);

}

}

return b;

}
int main()

{

setlocale(LC_ALL, "Russian");

int c;

c = recurs(100);

cout << "Количество операций = " << c << endl;

}
Скриншот 7:



Выводы



Цель работы была - изучить понятия рекурсии, рекурсивные функции в программировании, приемы построения рекурсивной триады при решении задач, научиться применять рекурсивные методы в решении задач на языке С++, считаю, что 5 задач по этой теме помогли мне с этим, всё работает исправно, значит, цель была достигнута.