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

laba3

.pdf
Скачиваний:
1
Добавлен:
12.12.2024
Размер:
387.25 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра безопасности информационных систем (БИС)

Рекурсия. Типы рекурсий

Отчет по лабораторной работе №3 по дисциплине «Языки программирования»

Выполнил:

Студент гр. 730-2

____Подойницын К.В.

12.04.2022

Принял:

Преподаватель кафедры КИБЭВС

Полюга В.А. 12.04.2022

Томск 2022

2

1 Введение

Цель работы: изучение различных типов рекурсий и способов их

применения для решения практических задач.

3

2 Ход работы

В данной работе рассматриваются разные виды рекурсий.

Линейная – рекурсия, при которой рекурсивные вызовы на любом рекурсивном срезе, инициируют не более одного последующего рекурсивного вызова.

Пример линейной рекурсии приведен на рисунке 1.

Рисунок 1 – Пример линейной рекурсии.

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

4

Рисунок 2 – Пример повторной рекурсии.

Каскадная рекурсия – рекурсивные вызовы могут возникнуть более одного раза на одном рекурсивном срезе, образуя древовидную схему вызовов.

Пример каскадной рекурсии представлен ниже (рисунок 3).

Рисунок 3 – Пример каскадной рекурсии.

Удаленная рекурсия – если в теле функции при рекурсивных вызовах, в

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

5

Рисунок 4 – Пример удаленной рекурсии.

Взаимная рекурсия – циклическая последовательность вызовов нескольких функций друг друга. Ниже показан пример взаимной рекурсии

(рисунок 5).

Рисунок 5 – Пример взаимной рекурсии.

6

Заключение В ходе лабораторной работы были изучены виды рекурсий и написаны

программы, демонстрирующие их. Для реализации программы был использован язык программирования C++.

7

Приложение А

(Обязательное)

Листинг программы

#include <iostream> #include <iomanip> #include <cmath> using namespace std;

int factorial(int n) //линейная рекурсия

{

if (n == 0) return 1;

if (n < 0) return 0;

else

return n * factorial(n - 1);

}

int main()

{

setlocale(LC_ALL, "ru"); int n;

cout << "Введите число для нахождения факториала: "; cin >> n;

cout << "Результат " << factorial(n) << endl;

}

#include <iostream> #include <iomanip> using namespace std;

int p(int a, int b) //повторная

{

if (a < 0 && b < 0) return 0;

else

if (a == 1 || b == 1) return p(a + 5, b + 5); else return p(a * 3, b * 3);

}

int main()

{

int a, b; setlocale(LC_ALL, "ru"); cout << "Введите a: "; cin >> a;

cout << "Введите b: "; cin >> b;

cout << p(a, b) << endl;

}

#include <iostream> #include <iomanip> using namespace std;

int vzaim(int a, int b) // взаимная

8

{

if (a < b)

b = b - a;

return vzaim2(a, b);

}

int vzaim2(int a, int b)

{

if (a > b)

a = a - b;

return vzaim(a, b);

}

int main()

{

int a, b; setlocale(LC_ALL, "ru"); cout << "Введите a: "; cin >> a;

cout << "Введите b: "; cin >> b;

cout << vzaim(a, b) << endl;

}

#include <iostream> #include <iomanip> using namespace std;

int Fib(int n) // каскадная

{

if (n == 0 || n == 1) return n;

else return Fib(n - 1) + Fib(n - 2);

}

int main()

{

int n;

setlocale(LC_ALL, "ru"); cout << "Введите n: "; cin >> n;

cout << Fib(n) << endl;

}

#include <iostream> #include <iomanip> using namespace std;

int A(int n, int m) // удаленная

{

if (n == 0) return m + 1;

else

if ((n != 0) && (m == 0)) return A(n - 1, 1);

else

return A(n - 1, A(n, m - 1));

}

int main()

{

int n, m;

9

setlocale(LC_ALL, "ru"); cout << "Введите n: "; cin >> n;

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

cout << A(n, m);

}

Соседние файлы в предмете Языки программирования