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

ЯП Лабораторная работа 3

.pdf
Скачиваний:
0
Добавлен:
17.06.2025
Размер:
495.66 Кб
Скачать

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

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

Кафедра комплексной информационной безопасности электронновычислительных систем (КИБЭВС)

РЕКУРСИЯ. ТИПЫ РЕКУРСИЙ Отчет по лабораторной работе №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