
ЯП Лабораторная работа 3
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронновычислительных систем (КИБЭВС)
РЕКУРСИЯ. ТИПЫ РЕКУРСИЙ Отчет по лабораторной работе №3
по дисциплине «Языки программирования» Вариант №21
Студент гр. 7х3-х
_______ хххххххх
_______
Приняла: Преподаватель каф. КИБЭВС
_______ ххххххххх
_______
Томск 2025
Введение
Целью работы является изучение различных типов рекурсий и способов их применения для решения практических задач.
Постановка задачи:
1.Изучить краткие теоретические сведения;
2.Разработать программу или комплекс программ, реализующих все типы рекурсий на одном из языков программирования (см. Варианты языков);
3.Реализовать индивидуальное задание, соответствующее своему варианту;
4.Написать отчет и защитить у преподавателя.
2

1 ОСНОВНЫЕ ВИДЫ РЕКУРСИИ
Для выполнения работы был выбран язык программирования Java, исходный код программы представлен в приложении А.
На рисунке 1.1 – рисунке 1.10 представлены основные виды рекурсии реализованные на выбранном языке программирования с результатами их работы.
Рисунок 1.1 – Линейная рекурсия
Рисунок 1.2 – Результат работы линейной рекурсии
Рисунок 1.3 – Повторная рекурсия
3

Рисунок 1.4 – Результат работы повторной рекурсии
Рисунок 1.5 – Взаимная рекурсия
Рисунок 1.6 – Результат работы взаимной рекурсии
Рисунок 1.7 – Каскадная рекурсия
4

Рисунок 1.8 – Результат работы каскадной рекурсии
Рисунок 1.9 – Удаленная рекурсия
Рисунок 1.10 – Результат работы удаленной рекурсии
5

2 РЕАЛИЗАЦИЯ РЕКУРСИИ ПО ИНДИВИДУАЛЬНОМУ ЗАДАНИЮ
В рамках индивидуального задания нужно реализовать следующее:
Для заданного одномерного массива D из N элементов найти количество элементов массива, для которых выполняется условие Di > i. Рекурсивную функцию применять каждый раз отдельно для первого элемента массива и для остальной его части. Рекурсивные вызовы заканчивать, когда останется только один элемент.
На рисунке 2.1 – рисунке 2.2 представлена программная реализация и результат работы рекурсии.
Рисунок 2.1 – Рекурсия по индивидуальному заданию
Рисунок 2.2 – Результат работы рекурсии
6
Заключение
В ходе выполнения данной работы были изучены основные виды рекурсий и способы их применения, а также выполнено задание по варианту с использованием одного из видов рекурсий.
7
Приложение А Код программы
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList;
public class Main { //Произведение цифр в числе static int Linear(int k) {
if (k < 10)
{
return k;
}
else
{
return k % 10 * Linear(k / 10);
}
}
//Деление нацело
static int Repeated(int a, int b, int k1){ if (a >= b) {
return Repeated(a - b, b, k1 + 1);
}
else
{
return k1;
}
}
//Определение четности или нечетности числа static String Mutual(int b2){
if (b2 == 0) return "Чётное"; else return Mutual2(b2 - 1);
}
static String Mutual2(int b2){
if (b2 == 0) return "Нечётное"; else return Mutual(b2 - 1);
}
//Количество сочетаний
8
static int Cascade(int n, int m){
if ((m == 0) && (n > 0) || (m == n) && (n > 0)){ return 1;
}
else{
if ((m > n) && (n >= 0)){ return 0;
}
else{
return Cascade(n - 1, m - 1) + Cascade(n - 1, m);
}
}
}
//Функция Аккермана
static int Remote(int n, int m) { if (n == 0) return m + 1;
if (m == 0) return Remote(n - 1, 1);
if (m!=0 && n != 0) return Remote(n - 1, Remote(n, m -1)); return 0;
}
//Определение количества элементов массива, которые больше, чем их порядковый номер в массиве
static int Individual(ArrayList<Integer> D, int i){ if (i == D.size() - 1)
{
return (D.get(i) > i) ? 1 : 0;
}
int currentCount = (D.get(i) > i) ? 1 : 0;
return currentCount + Individual(D, i + 1);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Введите значение для линейной функции:"); try {
int linear = Integer.parseInt(br.readLine());
int linearResult = Linear(linear);
9
System.out.println("Результат: " + linearResult); } catch(Exception e) {
System.out.println("Что-то пошло не так :(");
}
System.out.println("\nВведите значения для повторной функции:"); try{
int a = Integer.parseInt(br.readLine()); int b = Integer.parseInt(br.readLine()); int k1 = 0;
int repeatedResult = Repeated(a,b,k1);
System.out.println("Результат: " + repeatedResult); } catch(Exception e){
System.out.println("Что-то пошло не так :(");
}
System.out.println("\nВведите значение для взаимной функции:"); try{
int mutual = Integer.parseInt(br.readLine());
String mutualResult = Mutual(mutual);
System.out.println("Результат: " + mutualResult); } catch(Exception e){
System.out.println("Что-то пошло не так :(");
}
System.out.println("\nВведите значения для каскадной функции:"); try{
int cascadeN = Integer.parseInt(br.readLine()); int cascadeM = Integer.parseInt(br.readLine());
int cascadeResult = Cascade(cascadeN, cascadeM);
System.out.println("Результат: " + cascadeResult); } catch (Exception e){
System.out.println("Что-то пошло не так :(");
}
10