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

Отчет к пр3

.doc
Скачиваний:
14
Добавлен:
24.01.2023
Размер:
133.12 Кб
Скачать

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

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

(СПбГУТ)

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

ОТЧЁТ

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

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

Выполнил: студент группы ИСТ-114, Медведева С.Г.,

«12» октября 2022 г. ___________/Медведева С.Г.

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

«12» октября 2022 г. ___________/ И.А. Моисеев /

1 Основная часть

    1. Цель работы

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

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

#include <iostream> #include <string> #include <cmath> #include <chrono> #include <clocale> #include <Windows.h> using namespace std; int vav{}; int taskOne (int n){ //функция для первой задачи if ( n == 1 || n == 2 ) return 1; return taskOne (n-1) + taskOne(n-2); } long long taskTwo (int n, int m){ if ( m == 0 ) { vav++; return 1; } if (n == m ) return 1; return taskTwo (n-1,m-1) + taskTwo(n-1, m); } long long taskTwoOne (int n, int m){ long long vav{1}; int it{}; for (int i{max(m, n-m)+1}; i < n+1; i++){ vav*=i; it++; } long long vuv{1}; for (int i {1}; i < min(m, n-m)+1; i++){ vuv *= i; it++; } cout << "Количество интераций для итрационного метода подсчета итераций " << it << endl; return vav/vuv; } int taskThree(int n, int m){ int it{}; while(n!= 0 && m!=0){ n > m? n%=m: m%=n; it++; } cout << "Количество итераций для не рекурсивного метода " << it << endl; return (n+m); } int taskThreeOne (int n, int m, int it = 0){ if (n== 0 || m==0) { cout << "Количество итераций для рекурсивного метода " << it << endl; return max(n, m); } n > m? taskThreeOne(n%m,m,++it) : taskThreeOne(n,m%n,++it); } int taskFour (int n, int it = 0){ cout << n << " -> "; if (n == 153) return it; string sN {to_string(n)}; int vav{}; for (int i{}; i < sN.size();i++){ vav+= pow(sN[i] -'0',3); } return taskFour(vav,++it); } int taskFive(int n, int it = 0){ if (n == 1 ) return it; if (n%2 == 0) return taskFive(n/2,++it); else return taskFive(n-1, ++it); } int main() { auto begin = chrono::steady_clock::now(); //штуки для подсчета времени auto end = chrono::steady_clock::now(); int n,m; cout << "Enter number task:"; int numberTask{}; cin >> numberTask; switch (numberTask) { case 1:{ //Задача первая (последовательность) cout << "Enter number:"; // вводится число из последовательности cin >> n; cout << n <<" member of the sequence:" << taskOne(n) << endl; //выводится номер числа с этой последовательности taskOne() break; } case 2:{ //Задача вторая (число сочетаний) cout << endl << "Number of combinations." << endl << "n = "; cin >> n; cout << "m = "; cin >> m; //подсчет времени и вызов нерекурсивной функции подсчета сочетаний begin = chrono::steady_clock::now(); long long vav {taskTwoOne(n,m)}; end = chrono::steady_clock::now(); cout << "Cn(m) =" << vav << " Time:" << (chrono::duration_cast<chrono::milliseconds>(end - begin)).count() << endl; //подсчет времени и вызов рекурсивной функции подсчета сочетаний begin = chrono::steady_clock::now(); vav = taskTwo(n,m); end = chrono::steady_clock::now(); cout << "Количество итераций для рекурсивного метода " << vav << endl; cout << "Cn(m) =" << vav << " Time:" << (chrono::duration_cast<chrono::milliseconds>(end - begin)).count() << endl; break; } case 3:{ //Задача третья (Наибольший общий делитель) cout << endl << "The greatest common divisor." << endl << "n ="; cin >> n; cout << "m ="; cin >> m; //подсчет времени и вызов нерекурсивной функции НОД begin = chrono::steady_clock::now(); int vav {taskThree(n,m)}; end = chrono::steady_clock::now(); cout << "NOD = " << vav << " Time: " << (chrono::duration_cast<chrono::milliseconds>(end - begin)).count() << endl; //подсчет времени и вызов рекурсивной функции НОД begin = chrono::steady_clock::now(); vav = taskThreeOne(n,m); end = chrono::steady_clock::now(); cout << "NOD = " << vav << " Time: " << (chrono::duration_cast<chrono::milliseconds>(end - begin)).count() << endl; break; } case 4:{ // Задача 4 (Найти количество операций до числа 153) cout << "n ="; cin >> n; cout << "Answer "<< taskFour(n) << endl; break; } case 5:{ //Задача 5 (Найти количество итераций от 1 до 100) cout << "Number of iterations: " << taskFive(100); break; } } return 0; }

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

Рис 1.

1.3 Вывод

Изучены понятие рекурскии, рекурсивные функци в программировании, приемы построения рекурсивной функции.

Санкт-Петербург 2022

Соседние файлы в предмете Алгоритмы и системы данных