Читайте также: |
|
Рекуррентные объекты, соотношения, функции. Среда - Рекуррентность (объекты, модели). Средства реализации - рекурсия (процедуры, функции). Рекурсия - определение некоторого объекта через себя. Таковыми могут быть числовые функции (n!), комбинаторные объекты (дерево, путь), геометрические объекты (кривая Пеано), определения в программировании (ЦБЗ, идентификатор, арифметическое выражение) и пр. В каждом случае требуется конкретизация определения. Так, например, рекурсивное определение функции - способ ее задания, когда искомое значение определяется через значение этой функции в некотором наборе предшествующих точек (при соответствующем определении предшествования), в динамическом программировании рекурсивно определяется траектория.
Выражение объекта (в частности функции) через подобные является рекуррентным соотношением. Очень удобно записывать рекуррентное соотношение используя рекурсивную функцию или процедуру (т.е. функцию или процедуру, тело которой содержит обращение к ней же (прямо или косвенно)).
Рекурсия часто используется при доказательстве (метод мат. индукции) и в расчетах (причем часто доказательство по индукции соответствует конструктивному алгоритму расчета).
Рекурсия практикуется не только в математике, но там нередко счи- тается дурным тоном ("масло масляное"). В конструктивной математике, логике в программировании рекурсия - естественный способ определения, например,
<целое без знака>::=<цифра>|<цифра><целое без знака>
В программировании и алгоритмизации особую роль играет рекуррентно определяемый линейный список:
<линейный список>::=<пусто>|<звено>|<звено>,<линейный список>
Таким образом, эффективно определяются весьма полезные в моделировании линии на графах, различной породы деревья и прочие универсальные средства моделирования.
В некоторых случаях равнозначны и эквивалентны по наглядности рекурсивное и не рекурсивное (итеративное) определения, скажем,
в других представляется более естественным (числа Фибоначчи) или менее привычным (конечное кардинальное число). В любом случае, рекурсивное определение важно как средство построения бесконечного множества объектов на основе конечного множества исходных (общность алгоритмов).
Будучи средством моделирования рекурсия применяется и в описании алгоритмов и программ, представляя собой синхронный встроенный интерпретатор структуры моделируемого объекта. Поскольку все программирование условно складывается в виде двух разделов - структур данных и операций, в таком же виде рекурсия проникает и в языки программирования (записи или составные данные как структуры и рекурсивные функции или процедуры как операции). Существуют языки программирования, полностью построенные на рекурсии (LISP). Рекурсивные вычисления лучше использовать, когда в постановке задачи рекурсия присутствует в явном виде.
В общем виде рекурсивную программу P или функцию можно представить в виде некоторой композиции T множества операторов S не содержащих P и самой P. P = T (S,P)
Если некоторая процедура содержит явную ссылку на себя, говорят о явной рекурсии, через другие - косвенную. Появление рекурсивных процедур стало возможным при динамическом распределении памяти. Вызов рекурсивной процедуры требует выделения памяти под локально определяемые в этой процедуре объекты, таким образом формируется стек где хранятся данные, участвующие во всех вызовах процедуры, при которых на не завершила работу. Стек разбит на фрагменты, представляющие собой блоки последовательных ячеек. Каждый вызов процедуры использует фрагмент стека, длина которого зависит от вызываемой процедуры, из этих областей памяти доступна только последняя. Выход из рекурсивной процедуры означает освобождение последней элемента стека с полной утратой локальной информации. Кроме локальных переменных в этом стеке также хранится информация о "точке выхода" - команде процедуры, который будет передано управление.
Некоторые полезные выводы.
1) Рекурсивная функция или процедура соответствует организации транслятором языка программирования стека обращений и локальных данных процедур. От рекурсивной процедуры можно избавиться, организовав этот стек "вручную" (не забывая "точку выхода", если в теле процедуры имеется несколько обращений к ней) но это не всегда оправдано по затратам памяти и времени и, почти всегда, по сложности устройства программы. Совсем плохо дело в случае косвенной рекурсии, когда записи стека различные в зависимости от очередного обращения.
2) Чтобы "стек" экономно расходовал память, не следует вводить в теле рекурсивной процедуры много локальных переменных, всегда не желательно определять массивы. Во избежание непредсказуемых последствий в теле рекурсивной процедуры не следует определять глобальные переменные но следует внимательно следить за зонами действия идентификаторов.
3) Рекурсивная процедура может порождать неограниченные вычисления, поэтому при ее проектировании следует провести теоретические расчеты возможной глубины рекурсии (и требуемой памяти) а при отладке программы позаботиться об идентификации уровня рекурсии, например, используя глобальную переменную Level=0, увеличивая ее значение на единицу при входе в подпрограмму или функцию и уменьшая на единицу при выходе. Чаще всего такой параметр имеется в модели программируемого процесса. Другой вывод - желательно, чтобы рекурсивная процедура имела единственный выход, например, структуру:
Обоснование корректности (конечности алгоритма, как правило, связано с обоснованием монотонности некоторой функции, зависящей от уровня рекурсии или количества обращений.
Иногда такие расчеты очень сложны (пример дважды рекурсивной функции Аккермана)
Рекомендации по устранению (не применению рекурсии)
1. Случай единственного обращения к процедуре
2. Случай многократной активизации одного и того же обращения.
Семестр 2. Задачи лаборатороного задания 1 (рекуррентные соотношения).
1. Найти n-ю производную f(x) = exp(-x*x/2), построив для f(n)(x) рекуррентное соотношение.
2. Найти n-ю производную f(x) = exp(a*x*x+b*x+c), построив для f(n)(x) рекуррентное соотношение.
3. Подсчитать числа Бернулли Bk: B0 = 0, при k>0 B0 + C(1,k+1) B1 + C(2,k+1) B2 +... + C(k,k+1) Bk=0 Заполнить ими массив b[0:k].
4. Вычислить конечные разности в интерполяционной формуле Гаусса. Задан массив Y[-n:n] = C[0,-n:n], в нем же подсчитать C[0,0], C[1,1], C[1,2], C[2,3], C[2,4],..., C[n,2n-1], C[n,2n] если C[i,k] = C[i,k-1] - C[i-1,k-1]
5. Вычислить конечные разности в интерполяционной формуле Стирлинга. Задан массив Y[-n:n] = C[0,-n:n], в нем же подсчитать
6. Вычислить конечные разности в интерполяционной формуле Бесселя. Задан массив Y[-n:n] = C[0,-n:n], в нем же подсчитать
Семестр 2. Задачи лаборатороного задания 2
(Более сложные рекуррентные соотношения)
Решить следующие задачи используя или не используя рекурсивную процедуру, обосновать выбор. Привести и обосновать используемые рекуррентные соотношения. Теоретически оценить эффективность алгоритма, провести численный эксперимент до максимальной разумной размерности решения задачи.
определить раннее время завершения выполнения всех работ.
15 Система счисления — символический метод записи чисел, представление чисел с помощью письменных знаков.
· Число — некоторая абстрактная сущность, мера для описания количества.
· Цифры — знаки, используемые для записи чисел.
Цифры бывают разные: самыми распространёнными являются арабские цифры, представляемые знаками от нуля (0) до девяти (9); менее распространены римские цифры, их можно встретить на циферблате часов или в обозначении века (XIX век).
Поскольку чисел гораздо больше чем цифр, то для записи числа обычно используется набор (комбинация) цифр. Только для небольшого количества чисел — для самых малых по величине — бывает достаточно одной цифры. Существует много способов записи чисел с помощью цифр, называемых системой счисления. Величина числа может зависеть от порядка цифр в записи, а может и не зависеть. Это свойство определяется системой счисления и служит основанием для простейшей классификации таких систем, что позволяет все системы счисления разделить на три класса (группы):
· позиционные;
· непозиционные;
· смешанные.
Позиционные системы счисления подробно рассмотрены ниже, после краткого обзора смешанных и непозиционных систем.
Денежные знаки — это пример смешанной системы счисления.
Перевод чисел из одной системы счисления в другую составляет важную часть машинной арифметики. Рассмотрим основные правила перевода.
1. Для перевода двоичного числа в десятичное необходимо его записать в виде многочлена, состоящего из произведений цифр числа и соответствующей степени числа 2, и вычислить по правилам десятичной арифметики:
При переводе удобно пользоваться таблицей степеней двойки:
Таблица 4. Степени числа 2
n (степень) | |||||||||||
![]() |
Пример. Число перевести в десятичную систему счисления.
2. Для перевода восьмеричного числа в десятичное необходимо его записать в виде многочлена, состоящего из произведений цифр числа и соответствующей степени числа 8, и вычислить по правилам десятичной арифметики:
При переводе удобно пользоваться таблицей степеней восьмерки:
Таблица 5. Степени числа 8
n (степень) | |||||||
![]() |
Пример. Число перевести в десятичную систему счисления.
3. Для перевода шестнадцатеричного числа в десятичное необходимо его записать в виде многочлена, состоящего из произведений цифр числа и соответствующей степени числа 16, и вычислить по правилам десятичной арифметики:
При переводе удобно пользоваться таблицей степеней числа 16:
Таблица 6. Степени числа 16
n (степень) | |||||||
![]() |
Пример. Число перевести в десятичную систему счисления.
Для перевода десятичного числа в двоичную систему его необходимо последовательно делить на 2 до тех пор, пока не останется остаток, меньший или равный 1. Число в двоичной системе записывается как последовательность последнего результата деления и остатков от деления в обратном порядке.
Пример. Число перевести в двоичную систему счисления.
Для перевода десятичного числа в восьмеричную систему его необходимо последовательно делить на 8 до тех пор, пока не останется остаток, меньший или равный 7. Число в восьмеричной системе записывается как последовательность цифр последнего результата деления и остатков от деления в обратном порядке.
Пример. Число перевести в восьмеричную систему счисления.
Для перевода десятичного числа в шестнадцатеричную систему его необходимо последовательно делить на 16 до тех пор, пока не останется остаток, меньший или равный 15. Число в шестнадцатеричной системе записывается как последовательность цифр последнего результата деления и остатков от деления в обратном порядке.
Пример. Число перевести в шестнадцатеричную систему счисления.
Чтобы перевести число из двоичной системы в восьмеричную, его нужно разбить на триады (тройки цифр), начиная с младшего разряда, в случае необходимости дополнив старшую триаду нулями, и каждую триаду заменить соответствующей восьмеричной цифрой (табл. 3).
Пример. Число перевести в восьмеричную систему счисления.
Чтобы перевести число из двоичной системы в шестнадцатеричную, его нужно разбить на тетрады (четверки цифр), начиная с младшего разряда, в случае необходимости дополнив старшую тетраду нулями, и каждую тетраду заменить соответствующей восьмеричной цифрой (табл. 3).
Пример. Число перевести в шестнадцатеричную систему счисления.
Дата добавления: 2015-01-30; просмотров: 220 | Поможем написать вашу работу | Нарушение авторских прав |