Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Лабораторная работа № 16. Алгоритмы сортировок подсчетом, пирамидальных, слиянием, поразрядных




Лабораторная работа № 1. Рекурсивные алгоритмы

Рекурсия - это такая организация работы, при которой функция вызывает сама себя.

 

Задание Краткие теоретические сведения
1. Изучить использование простых рекурсивных функций на примере программы, представленной в правой части. Определить признак конца ввода чисел, проанализировав текст программы. Добавить операторы, позволяющие определить, сколько раз функция binPrn вызывает сама себя.       Пример программы перевода десятичного числа в двоичный вид с использованием рекурсии.
2. Выполнить програм-му, разработанную с использованием рекурсии. Реализовать алгоритм без использования рекурсии.   Пример. Определить, является ли заданная строка палиндромом, т.е. читается одинаково слева направо и справа налево. Идея решения заключается в просмотре строки одновременно слева направо и справа налево и сравнении соответствующих символов. Если в какой-то момент символы не совпадают, делается вывод о том, что строка не является палиндромом, если же удается достичь середины строки и при этом все соответствующие символы совпали, то строка является палиндромом. Граничное условие - строка является палиндромом, если она пустая или состоит из одного символа.      
3. Выполнить программу, приведенную в правой части. Записать ее условие. Добавить любое слово в массив w и проанализировать результат работы программы. Если некоторое слово в массиве w не подходит для решения задачи, то добавить операторы вывода сообщения о том, что его нужно изменить.      
#include < iostream> using namespace std; char *w[] = { " ПАЛКА", " ЛЯГУШКА", " КАПЛЯ", " КАРТА", NULL }; int TEST(char *s, char *r) { int n; n = strlen(s); if (n == 0) return 1; for (; *s! = 0 & & n > 1; s++, n--) if (strncmp(s, r, n) == 0) return 1; return 0; } int step(char *lw)// текущее слово { setlocale (LC_CTYPE, " Russian" ); int n; for (n = 0; w[n]! = NULL; n++) if (*w[n]! = 0) break; if (w[n] == NULL)// цепочка выстроена return 1; for (n = 0; w[n]! = NULL; n++) { char *pw; if (*w[n] == 0) continue; pw = w[n]; // пустое слово - пропустить w[n] = " "; if (TEST(lw, pw)) { if (step(pw))//присоединено { cout < < pw < < " \n"; return 1; } } w[n] = pw } return 0; } void main() { step(" " ); }    

4. В соответствии со своим вариантом выполнить задания из таблицы, представленной ниже.

 

Условие задачи Пояснения к алгоритму
1, 2 Разработать программу, реализующую рекурсивную функцию подсчета количества x(m) разбиений натурального числа m в виде суммы натуральных чисел. Для m = 4 разбиения имеют вид: 4, 3+1, 2+2, 2+1+1, 1+1+1+1. Таким образом, x(m) = 5. Функция подсчета P(m, n) количества разбиений натурального числа m со слагаемыми, не превосходящими n, определяется следующим образом: При этом x(m) = P(m, m).
3, 4 Разработать программу, реализующую рекурсивную функцию f(x, n), вычисляющую величину xn/n! при любом вещественном x и любом неотрицательном целом n. Для вычисления xn-1/(n-1)! надо рекурсивно обратиться к f(x, n-1), а затем полученную величину умножить на x/n, чтобы получить значение f(x, n). Функция f(x, n)принимает следующий вид:
5, 6 Разработать программу, реализующую рекурсивную функцию подсчета количества всех положительных делителей натурального числа n. Рассмотрим более общую задачу подсчета для натурального числа n количества всех его положительных делителей, меньших или равных заданному натуральному числу x. Пусть dn(n) и dnx(n, x) − функции для решения исходной и обобщенной задач. Рекурсивную функцию dnx(n, x), по которой последовательно подвергаются испытанию на делители n все числа от 1 до x включительно, можно определить так: Очевидно, что dn(n) = dnx(n, n).
7, 8 Задан прямоугольник со сторонами а и b (a, b − натуральные числа). Разбить его на части с помощью квадратов и определить, сколько квадратов получится, если каждый раз выбирается самый большой квадрат. Пусть, например a > b. Тогда, отрезав от прямоугольника floor(a/b) квадратов со сторонами длиной b, снова окажемся перед исходной задачей, в которой a = b и b = mod(a, b) (b = a - floor(a / b) × b). В качестве базы рекурсии можно взять случай b = 0. Если numsq(a, b) − функция, возвращающая решение задачи при заданных длинах a и b сторон исходного прямоугольника, то
9, 10 Рекурсивно описать функцию C(m, n), где 0 < = m < = n для биноминального коэффициента Сn. Формулы имеют следующий вид: Сno = Сnn = 1; Сnm = Сn-1m + Сn-1m-1
11, 12 Пусть для целых неотрицательных чисел n, m разрешены операции нахождения последующего числа (n + 1) и предыдущего числа n-1 (n > 0). С помощью рекурсивных функций определить операции нахождения суммы (n + m), разности (n - m), умножения (n × m), возведения в степень n ^ m (n > 0). Для суммы a + b очевидно соотношение: Оно задает одновременно и базу рекурсии и правило декомпозиции. По нему построена функция, определяющая сложение: Разность: Умножение: Возведение в степень:
13, 14 Пусть функция f(x) вещественной переменной x непрерывна на отрезке [a, b] и f(a)× f(b) < 0. Разработать рекурсивную программу нахождения на отрезке [a, b] какого-либо вещественного корня. Для определения корня можно использовать метод деления отрезка пополам. С использованием рекурсии: Здесь e-заданная точность решения.
15, 16 Разработать программу, реализующую рекурсивный алгоритм для вычисления значений полиномов по определенной функции. Функция имеет следующий вид:

 

5. К номеру своего варианта прибавить число 2 и написать программу для новых исходных данных (для вариантов 15, 16 перейти к вариантам 1, 2).

6. Дополнительные задания.

1. Ввести цифру А, записать в файл все возможные числа, состоящие из цифр, не превышающих или равных A. Количество цифр в числах должно быть равно А. Примечание: использовать дополнительный массив.

2. Рекурсивно определить k-й элемент последовательности целых чисел Люка. Числа задаются рекурсивной формулой: Ln = Ln-1 + Ln-2, где L0 = 2, L1 = 1. То есть последовательность чисел Люка: 2, 1, 3, 4, 7, 11, 18…. Число k вводится с клавиатуры.

3. Задача проведения границы на карте (“создание военных блоков”). Страны на карте заданы матрицей смежности. Если страны i, j имеют на карте общую границу, то элемент матрицы A[i, j] равен 1, иначе 0. Необходимо разбить страны на две группы так, чтобы количество пар смежных стран из противоположных групп было минимальным.

4. Дано n различных натуральных чисел (n = 5). Напечатать все перестановки этих чисел.

5. Последовательность из латинских букв строится следующим образом: на нулевом шаге она пуста, на каждом последующем последовательность удваивается, то есть приписывается сама к себе, и к ней слева добавляется очередная буква алфавита (a, b, c, …).

6. По заданному числу n определить символ, который стоит на n-м месте последовательности, получившейся после шага 26.

 

 

 

 

В начало практикума


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 696; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.012 с.)
Главная | Случайная страница | Обратная связь