Лабораторная работа асд. Лабораторные работы_по_АСД. Дисциплина Алгоритмы и структуры данных Отчёт по лабораторной работе
Скачать 3.09 Mb.
|
Задача 7. Написать рекурсивную программу вычисления n-го числа Фибоначчи. Последовательность чисел Фибоначчи имеет вид: 1, 1, 2, 3, 5, 8, 13, 21, 34, … (an=an-1+ an-2), для n начиная с 3. Все используемые идентификаторы представлены в таблице 38 Таблица 38 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 75. Рисунок 74. Блок схема алгоритма решения задачи 7 Программа на C#: using System; namespace lr7_z7 { class Program { static void Main(string[] args) { int Fibonacci(int c) { if (c == 0 || c == 1) return c; else return Fibonacci(c - 1) + Fibonacci(c - 2); } Console.Write("Введите n: "); int n = int.Parse(Console.ReadLine()); int f = Fibonacci(n); Console.Write("a[{0}] = {1}", n, f); Console.ReadKey(); } } } } Скриншот результата работы программы представлен на рисунке 76. Рисунок 75. Скриншот результата работы программы задачи 7. Задача 8. Написать рекурсивную программу поиска минимального элемента массива. Все используемые идентификаторы представлены в таблице 39 Таблица 39 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 77. Рисунок 76. Блок схема алгоритма решения задачи 8 Программа на C#: using System; namespace lr7_z8 { class Program { static void Main(string[] args) { Console.Write("Введите n: "); int N = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите массив: "); int[] mas = new int[N]; for (int i = 0; i < N; i++) mas[i] = Convert.ToInt32(Console.ReadLine()); int m = Min(mas, mas[0]); Console.WriteLine("Минимальный элемент массива:" + m); Console.ReadKey(); int Min(int[] a, int min, int i = 0) { if (i >= N) return min; if (min > a[i]) return Min(a, a[i], i + 1); else return Min(a, min, i + 1); } } } } Скриншот результата работы программы представлен на рисунке 78. Рисунок 77. Скриншот результата работы программы задачи 8. Задача 9. Найдите НОД трёх чисел. Примечание: НОД(а,в,с)= НОД(НОД(а,в),с). НОД находите по определению. Все используемые идентификаторы представлены в таблице 40 Таблица 40 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 79. Рисунок 78. Блок схема алгоритма решения задачи 9 Программа на C#: using System; namespace lr7_z9 { class Program { static void Main(string[] args) { int NOD(int a, int b) { if (a == b) return a; if (a > b) return NOD(a - b, b); else return NOD(b - a, a); } Console.Write("Введите a: "); int A = int.Parse(Console.ReadLine()); Console.Write("Введите b: "); int B = int.Parse(Console.ReadLine()); Console.Write("Введите c: "); int C = int.Parse(Console.ReadLine()); int nod = NOD(NOD(A, B), C); Console.WriteLine("НОД({0}, {1}, {2}) = {3}", A, B, C, nod); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 80. Рисунок 79. Скриншот результата работы программы задачи 9. Задача 10. Проверьте, являются ли два данных числа взаимно простыми. Все используемые идентификаторы представлены в таблице 41 Таблица 41 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 81. Рисунок 80. Блок схема алгоритма решения задачи 10 Программа на C#: using System; namespace lr7_z10 { class Program { static void Main(string[] args) { int NOD(int a, int b) { if (a == b) return a; if (a > b) return NOD(a - b, b); else return NOD(b - a, a); } Console.Write("Введите A: "); int A = int.Parse(Console.ReadLine()); Console.Write("Введите B: "); int B = int.Parse(Console.ReadLine()); if (NOD(A, B) != 1) Console.Write("Числа не взаимно простые"); else Console.Write("Числа взаимно простые"); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 82. Рисунок 81. Скриншот результата работы программы задачи 10. Задача 11. Найдите наименьшее общее кратное двух чисел. НОК(n,m)=n*m/НОД(n,m). Все используемые идентификаторы представлены в таблице 42 Таблица 42 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 83. Рисунок 82. Блок схема алгоритма решения задачи 11 Программа на C#: using System; namespace lr7_z11 { class Program { static void Main(string[] args) { int NOD(int a, int b) { if (a == b) return a; if (a > b) return NOD(a - b, b); else return NOD(b - a, a); } Console.Write("Введите A: "); int A = int.Parse(Console.ReadLine()); Console.Write("Введите B: "); int B = int.Parse(Console.ReadLine()); int nok = A * B / NOD(A, B); Console.Write("НОК({0}, {1}) = {2}", A, B, nok); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 84. Рисунок 83. Скриншот результата работы программы задачи 11. Задача 12. Написать вариант алгоритма Евклида, основанный на соотношениях: НОД(2*а, 2*b)= 2*НОД(a,b); НОД(2*a,b) = НОД(a,b), при нечётном b, не включающий деления с остатком, а использующий лишь деление на 2 и проверку чётности. Все используемые идентификаторы представлены в таблице 43 Таблица 43 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 85. Рисунок 84. Блок схема алгоритма решения задачи 12 Программа на C#: using System; namespace lr7_z12 { class Program { static void Main(string[] args) { int NOD(int a, int b) { if (a == b) return a; if (a % 2 == 0 && b % 2 == 0) return 2* NOD(a / 2, b / 2); if (a % 2 == 0) return NOD(a / 2, b); if (b % 2 == 0) return NOD(a, b / 2); if (a > b) return NOD(a - b, b); else return NOD(b - a, a); } Console.Write("Введите А: "); int A = int.Parse(Console.ReadLine()); Console.Write("Введите В: "); int B = int.Parse(Console.ReadLine()); Console.Write("НОД({0}, {1}) = {2}", A, B, NOD(A, B)); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 86. Рисунок 85. Скриншот результата работы программы задачи 12. Задача 13. Вводится последовательность чисел. Вывести их в обратном порядке. Все используемые идентификаторы представлены в таблице 44 Таблица 44 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 87. Рисунок 86. Блок схема алгоритма решения задачи 13 Программа на C#: using System; namespace lr7_z13 { class Program { static void Main(string[] args) { void ReverseArray(int[] numbers, int i) { if (i == 0) return; Console.Write(numbers[i - 1] + " "); ReverseArray(numbers, --i); } Console.Write("Введите количество чисел: "); int N = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите числа: "); int[] mas = new int[N]; for (int i = 0; i < N; i++) mas[i] = Convert.ToInt32(Console.ReadLine()); Console.Write("Числа в обратном порядке: "); ReverseArray(mas, N); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 88. Рисунок 87. Скриншот результата работы программы задачи 13. Задача 14. Напишите рекурсивную программу вычисления n-го члена геометрической прогрессии (bn= b1qn-1), суммы её n первых членов (рекурсивно) и суммы ее членов, начиная с i-гo по k-ый. Все используемые идентификаторы представлены в таблице 45 Таблица 45 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 89. Рисунок 88. Блок схема алгоритма решения задачи 14 Программа на C#: using System; namespace lr7_z14 { class Program { static void Main(string[] args) { Console.Write("Введите b1 : "); int b1 = int.Parse(Console.ReadLine()); Console.Write("Введите q: "); int q = int.Parse(Console.ReadLine()); Console.Write("Введите n: "); int n = int.Parse(Console.ReadLine()); Console.WriteLine("b[{0}] = {1}", n, MemberGeometric(n, b1)); double s1 = Sum(1, 0, n, b1, 0); Console.WriteLine("S[{0}] = {1}", n, s1); Console.Write("Введите i: "); int I = int.Parse(Console.ReadLine()); Console.Write("Введите k: "); int K = int.Parse(Console.ReadLine()); double s2 = Sum(1, I, K, b1, 0); Console.WriteLine("Сумма членов с {0} по {1} = {2}", I, K, s2); Console.ReadKey(); double Sum(int c, int i, int k, double cur, double sum) { if (c >= i && c <= k) sum += cur; if (c == k) return sum; else { cur *= q; return Sum(c + 1, i, k, cur, sum); ; } } double MemberGeometric(int c, double cur) { if (c == 1) return cur; else { cur *= q; return MemberGeometric(c - 1, cur); } } } } } Скриншот результата работы программы представлен на рисунке 90. Рисунок 89. Скриншот результата работы программы задачи 14. Задача 15. Описать рекурсивную функцию вычисления максимального числа Фибоначчи, ближайшего к заданному n по недостатку. Все используемые идентификаторы представлены в таблице 46 Таблица 46 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 91. Рисунок 90. Блок схема алгоритма решения задачи 15 Программа на C#: using System; namespace lr7_z15 { class Program { static void Main(string[] args) { Console.Write("Введите n: "); int n = int.Parse(Console.ReadLine()); int f = Fibonacci(1, 1); Console.Write("Найденное число: " + f); Console.ReadKey(); int Fibonacci(int c1, int c2) { if (c1 < n) return Fibonacci(c2, c1 + c2); else return c2 - c1; } } } } Скриншот результата работы программы представлен на рисунке 92. Рисунок 91. Скриншот результата работы программы задачи 15. Задача 16. Описать рекурсивную функцию поиска индекса минимального элемента массива. Все используемые идентификаторы представлены в таблице 47 Таблица 47 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 93. Рисунок 92. Блок схема алгоритма решения задачи 16 Программа на C#: using System; namespace lr7_z16 { class Program { static void Main(string[] args) { Console.Write("Введите n: "); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите массив: "); int[] mas = new int[n]; for (int i = 0; i < n; i++) mas[i] = Convert.ToInt32(Console.ReadLine()); int min_ind = MinIndex(mas, 0, 0); Console.WriteLine("Индекс минимального числа = {0}, это число - {1}" , min_ind, mas[min_ind]); Console.ReadKey(); int MinIndex(int[] a, int min, int i) { if (i >= n) return min; if (a[min] > a[i]) return MinIndex(a, i, i + 1); else return MinIndex(a, min, i + 1); } } } } Скриншот результата работы программы представлен на рисунке 94. Рисунок 93. Скриншот результата работы программы задачи 16. Задача 17. Написать функцию, которая находит НОД двух неотрицательных чисел по алгоритму Евклида (второй способ нахождения НОД – делением): Пусть х и у одновременно неравные нулю целые неотрицательные числа и пусть х>=y, тогда если у=0, то НОД(х,у)=х, а если у<>0, то для чисел х, у и r, где r – остаток от деления х на у выполняется равенство: НОД(х,у)= НОД(у,r). (Другими словами: Последний ненулевой остаток, деление на который осуществляется нацело и является НОД чисел х и у) Например: НОД(48,18)=?
Все используемые идентификаторы представлены в таблице 48 Таблица 48 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 95. Рисунок 94. Блок схема алгоритма решения задачи 17 Программа на C#: using System; namespace lr7_z17 { class Program { static void Main(string[] args) { int NOD(int a, int b) { if (b == 0) return a; else return NOD(b, a % b); } Console.Write("Введите A: "); int A = int.Parse(Console.ReadLine()); Console.Write("Введите B: "); int B = int.Parse(Console.ReadLine()); int nod = NOD(A, B); Console.WriteLine("НОД({0}, {1}) = {2}", A, B, nod); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 96. Рисунок 95. Скриншот результата работы программы задачи 17. Задача 18. Составить рекурсивную программу, проверяющую, является ли фрагмент строки с i-гo по j-ый символ палиндромом. Все используемые идентификаторы представлены в таблице 49 Таблица 49 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 97. Рисунок 96. Блок схема алгоритма решения задачи 18 Программа на C#: using System; namespace lr7_z18 { class Program { static void Main(string[] args) { bool Palindrome(string s, int a, int b) { if (a > b) return true; else { if (s[a] == s[b]) return Palindrome(s, a + 1, b - 1); else return false; } } Console.Write("Введите строку: "); string S = Console.ReadLine(); Console.Write("Введите i: "); int i = int.Parse(Console.ReadLine()); Console.Write("Введите j: "); int j = int.Parse(Console.ReadLine()); bool palindrome = Palindrome(S, i, j); if (palindrome) Console.Write("Строка с {0} по {1} палиндром", i, j); else Console.Write("Строка с {0} по {1} не палиндром", i, j); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 98. Рисунок 97. Скриншот результата работы программы задачи 18. |