
laba3
.pdf
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра безопасности информационных систем (БИС)
Рекурсия. Типы рекурсий
Отчет по лабораторной работе №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);
}