- •1, 4, 7. Решение нелинейных уравнений
- •2.Транспортная задача линейного программирования
- •9. Файловый ввод-вывод
- •12. Системный анализ
- •17.Смешанные, стратегии в матричных играх. Основная теорема матричных игр.
- •18. Моделювання випадкових факторів.
- •19. Первая интерполяционная формула Ньютона.
- •20. Числові характеристики випадкових величин.
- •21. Моделирование параллельных процессов.
- •22(19,25). Наближення функцій. Задача інтерполяції.
- •23. Математичне сподівання випадкової величини, його властивості та формули для обчислювання.
- •26. Булева алгебра
- •27. Класифікація моделей.
- •28. Численное дифференцирование .
- •30. Полиморфизм
- •31. Численное интегрирование.
- •32. Канонічні форми булевих функцій, способи побудови канонічних форм
- •33. Наследование
- •36.Об'єктно - орієнтоване програмування та його головні принципи
- •40. Методи розв'язування задачі Коші системи звичайних диференціальних рівнянь. Метод Ейлера. Методи типу Рунге-Кутта. Методи з вибором кроку інтегрування.
- •Розв’язування систем однорідних рівнянь з сталими коефіцієнтами методом Ейлера.
- •41. Методи спрощення булевих функцій
- •42. Процедури та функції. Призначення процедур та функцій. Формальні та фактичні параметри. Глобальні та локальні дані. Параметри значення і параметри змінні.
- •43. Методи розв'язування крайових задач системи звичайних диференціальних рівнянь. Різницеві схеми для рівнянь другого порядку. Методи прогонки.
- •44. Повні системи булевих функцій та базиси.
- •45. Використання стеку для організації рекурсивних обчислень.
- •46. Общая задача линейного программирования
- •50. Двійковий пошук на впорядкованій множині.
- •51. Динамічні структури даних. Стеки. Черги.
- •52. Симплекс-перeтворення. Симплекс-метод.
- •53. Алгоритми сортування.
- •54. Динамічні структури даних. Списки.
- •55. Теорема двоїстості. Двоїстий критерій оптимальності. Двоїстий симплекс-метод.
- •56. Керування подіями. Програмування обробки подій.
- •Виды событий.
- •События от мышки.
- •События от клавиатуры.
- •События сообщений.
- •"Пустые" события.
- •Передача событий.
- •57. Вказівники. Розподіл динамічної пам’яті.
- •58. Транспортна задача лінійного програмування. Методи знаходження початкового базисного розв'язку.
- •6.2. Умова існування розв'язку транспортної задачі
- •59. Математичне моделювання і диференціальні рівняння.
- •60. Мови програмування та їх класифікація
- •61. Транспортна задача лінійного програмування. Метод потенціалів.
- •6.2. Умова існування розв'язку транспортної задачі
- •6.3. Метод потенціалів
- •6.3.1. Алгоритм методу потенціалів складається з таких етапів.
- •6.3.2. Методи побудови опорного плану тз
- •Метод північно-західного кута
- •62.Задачі і методи математичного моделювання і системного аналізу. Приклади математичних моделей для детермінованих і випадкових процесів(див. 18).
- •63. Реляційна модель бази даних.
- •65. Моделювання процесів керування у живій природі біологічних, екологічних, процесів автоматизованого керування.
- •66. Інформаційна модель концептуального рівня. Основні поняття. Еволюція концепції бази даних. Типи запитів.
45. Використання стеку для організації рекурсивних обчислень.
Функция называется рекурсивной, если в её определении содержится вызов этой же функции. Различают простую рекурсию, когда текст программы функции F напрямую содержит вызов F, и косвенную рекурсию, когда F обращается к иным функциям, которые содержат вызов F.
Важным моментом при составлении рекурсивной программы является организация выхода. Здесь легко допустить ошибку, заключающуюся в том, что функция будет последовательно вызывать саму себя бесконечно долго. Поэтому рекурсивный процесс должен шаг за шагом так упрощать задачу, чтобы в конце концов для нее появилось не рекурсивное решение. Использование рекурсии не всегда желательно, так как это может привести к переполнению стека.
Более ранний рекурсивный вызов всегда закончится позже. Этот факт позволяет применить для управления локальной памятью рекурсивных процедур такую структуру данных как стек. Стек характеризуется следующими свойствами: он имеет неопределенный размер (реально размер ограничен техническими параметрами компьютера); элементы стека не нумеруются, доступен (для чтения) только один элемент, верхний; после удаления из стека верхнего элемента доступным становится следующий и т.д.; вновь помещаемый в стек элемент становится верхним. Таким образом, стек - линейная структура данных, доступная для чтения и записи только с одного конца, т.е. работа со стеком подчиняется дисциплине LIFO (last in - first out, последним включен - первым удален). Стек можно моделировать линейным списком, но это неэффективно по времени, поэтому обычно стек моделируется одномерным массивом и двумя индексными переменными - указателями на дно и на вершину стека. Современные компьютеры поддерживают стеки аппаратно - специальными регистрами-указателями на сегменты памяти, предназначенные для размещения стеков, на вершины стеков и командами для выполнения операций со стеками.
Работа со стеком производится следующим образом. При первом вызове рекурсивной процедуры (функции) в стеке резервируется место для всех значений, связанных с этим вызовом (это могут быть не только локальные переменные и параметры, но и некоторая служебная информация, скрытая от программиста). Делается это простым изменением значения указателя на вершину стека: оно увеличивается на необходимое число байт, если стек растет в сторону старших адресов памяти, или (как во многих компьютерах) уменьшается, если стек растет в сторону младших адресов памяти.
Перед вторым вызовом в области памяти первого вызова будут находиться некоторые значения, соответствующие начатым, но не завершенным вычислениям. Второй вызов резервирует в стеке область над областью первого вызова тем самым, перекрывая к ней доступ.
Рис.1. Изменение содержимого стека при обработке рекурсивных вызовов
Таким образом, вплоть до последнего вызова стек будет заполняться (так называемый прямой ход рекурсии). На рисунке 1 показаны состояния стека при выполнении вызова Factorial (4); нижняя область между дном и вершиной уже использована ранее вызванными другими процедурами (вызывающими по отношению к функции Factorial). Первый вызов помещает в стек значение 4, второй 3 и т.д. до тех пор, пока фактическим параметром вызова не станет значение 1. Затем начинается серия завершений вызовов с извлечением из стека сохраненных значений и использованием их для продолжения вычислений (в данном примере для выполнения операции умножения). Последним завершается первый вызов. На рисунке 1 изображено смещение указателя на вершину области.