You are on page 1of 4

Міністерство освіти і науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ


«ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»

Навчально-науковий інститут комп'ютерних наук та інформаційних технологій

Кафедра «Обчислювальна техніка та програмування»

ЗВІТ

з дисципліни "АЛГОРИТМИ ТА СТРУКТУРИ ДАНИХ"

про виконання Практичної роботи №2

РЕКУРСИВНІ ТА ІТЕРАЦІЙНІ

АЛГОРИТМИ

Виконав: студент групи КН-1022В


Гасюк М.О.

Перевірив: Старший викладач ОТП


Бречко В.О.

Харків-2023
2

Мета: набути навичок та практичного досвіду у розробці рекурсивних

програм.

Варіант №6

Код програми
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ASDP
{
class Program
{
// Функція для перетворення числа N в систему числення B (рекурсивний
метод)
static string RecursiveConvertToBase(int N, int B)
{
Console.WriteLine($"Початкове число: {N}");
Console.WriteLine($"База системи числення: {B}");
Console.WriteLine();

string result = RecursiveConvert(N, B);

// Удаляем ведущие нули, если они есть


result = result.TrimStart('0');

// Если результат пустой, это означает, что исходное число было 0


if (result == "")
{
result = "0";
}

return result;
}

// Рекурсивний метод для обчислення


static string RecursiveConvert(int N, int B)
{
if (N == 0)
{
return "";
}

int remainder = N % B;
Console.WriteLine($"Крок: {N} / {B} = {N / B}, Остача: {remainder}");

string recursiveResult = RecursiveConvert(N / B, B);

return recursiveResult + remainder;


}

// Функція для перетворення числа N в систему числення B (ітераційний


метод)
static string IterativeConvertToBase(int N, int B)
3

{
Console.WriteLine($"Початкове число: {N}");
Console.WriteLine($"База системи числення: {B}");
Console.WriteLine();

// Ініціалізуємо пустий рядок для зберігання результату


string result = "";

while (N > 0)
{
int remainder = N % B;
Console.WriteLine($"Крок: {N} / {B} = {N / B}, Остача:
{remainder}");

result = remainder + result;


N /= B;
}

result = result.TrimStart('0');

if (result == "")
{
result = "0";
}

return result;
}

static void Main()


{
Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.InputEncoding = System.Text.Encoding.Unicode;

int N = 123; // Замініть це число на бажане


int B = 8; // Замініть це число на бажану базу (B <= 10)

// Рекурсивний метод
Console.WriteLine("\nРекурсивний метод:");
Stopwatch recursiveStopwatch = new Stopwatch();
recursiveStopwatch.Start();
string recursiveResult = RecursiveConvertToBase(N, B);
recursiveStopwatch.Stop();
TimeSpan recursiveElapsedTime = recursiveStopwatch.Elapsed;
Console.WriteLine($"Результат в системі числення {B}:
{recursiveResult}");
Console.WriteLine($"Час виконання рекурсивного алгоритму:
{recursiveElapsedTime.TotalMilliseconds} мс");

// Ітеративний метод
Console.WriteLine("\nІтераційний метод:");
Stopwatch iterativeStopwatch = new Stopwatch();
iterativeStopwatch.Start();
string iterativeResult = IterativeConvertToBase(N, B);
iterativeStopwatch.Stop();
TimeSpan iterativeElapsedTime = iterativeStopwatch.Elapsed;
Console.WriteLine($"Результат в системі числення {B}:
{iterativeResult}");
Console.WriteLine($"Час виконання ітераційного алгоритму:
{iterativeElapsedTime.TotalMilliseconds} мс");
}
4

}
}

Ця програма написана на C#, вона робить функцію, що перетворює число N в


систему числення B, припустити умову B<=10, а також заміряє час виконання
обох методів, ось приклад

Рисунок №1 Результат программи

Висновок: За час виконання цієї практичної я зрозумів що використання


рекурсивних варіантів багатьох процедур може призвести до значних швидкісних
обмежень у порівнянні з їх ітераційними аналогами. Це обумовлено додатковими
витратами системних ресурсів на багаторазові виклики методу. Якщо кількість
таких викликів буде надто великою, може виникнути проблема переповнення
системного стеку. Тому в моєї практичної ітерціїний був більш швидшим ніж
рекурсивний.

You might also like