Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гос по информ телефон.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
232.82 Кб
Скачать

Рекуррентные соотношения

При решении многих комбинаторных задач пользуются методом сведения данной задачи к задаче, касающейся меньшего числа предметов. Метод сведения к аналогичной задаче для меньшего числа предметов называется методом рекуррентных соотношений (от латинского "recurrere" - "возвращаться").

Понятие рекуррентных соотношений проиллюстрируем классической проблемой, которая была поставлена около 1202 года Леонардо из Пизы, известным как Фибоначчи. Важность чисел Фибоначчи для анализа комбинаторных алгоритмов делает этот пример весьма подходящим.

Фибоначчи поставил задачу в форме рассказа о скорости роста популяции кроликов при следующих предположениях. Пара кроликов приносит раз в месяц приплод из двух крольчат (самки и самца), причем новорожденные крольчата через два месяца после рождения уже приносят приплод. Сколько кроликов появится через год, если в начале года была одна пара кроликов? Кролики никогда не умирают, и их воспроизводство никогда не прекращается.

Числа Фибоначчи определяются с помощью рекуррентного соотношения:

Первое и второе числа Фибоначчи равны 1

Для n > 2, ne число Фибоначчи равно сумме (n − 1)-го и (n − 2)-го чисел Фибоначчи

Факториал целого неотрицательного числа n (обозначается n!) определяется как n!=n*(n-1)! при n > 0 и n! = 1 при n = 0

Метод рекуррентных соотношений состоит в том, что решение комбинаторной задачи с n предметами выражается через решение аналогичной задачи с меньшим числом предметов с помощью некоторого соотношения, которое называется рекуррентным или возвратным. Пользуясь этим соотношением, искомую величину можно вычислить, исходя из того, что для небольшого количества предметов (одного, двух) решение задачи легко находится.

  1. Основные понятия объектно-ориентированного программирования

Объектно-ориентированная среда программирование создает окружение в виде множества независимых объектов. Каждый объект ведет себя подобно отдельному компьютеру, их можно использовать в решении задач как «черные ящики», не вникая во внутренние механизмы их функционирования.

Объектно-ориентированная методология проектирования программ основана на концепциях упрятывания информации и абстрактных типов данных. Такой подход рассматривает все такие ресурсы как данные, модули и системы в качестве объектов. Каждый объект содержит некоторую структуру данных (или тип данных), обрамленную набором процедур (методов), предназначенных для манипулирования этими данными. Программист может создать свой абстрактный тип данных и отобразить проблемную область в эти созданные им абстракции вместо традиционного отображения проблемной области в предопределенные структуры данного языка. Можно сконцентрироваться на проекте системы, не беспокоясь о деталях объектов, используемых в системе.

Этапы разработки программы: 1) определить задачу; 2) подобрать необходимые объекты; 3) с помощью объектов создается внешний интерфейс программы, настраивается, затем описывается процедуры для каждого объекта.

Класс - это категория объектов, обладающих одинаковыми свойствами и поведением. При этом объект представляет собой просто экземпляр какого-либо класса. Например, в Delphi тип “форма” (окно) является классом, а переменная этого типа - объектом. Объект – это структура данных, содержащая поля данных (аналогично типу запись Record) различных типов и заголовки методов. Свойство – это атрибут объекта, определяющий то, как объект выглядит или как он может вести себя. Событие –свойство процедурного типа, предназначенное для обеспечения реакции на те или иные действия. Например, воздействие пользователя на мышь или клавиатуру (движение мыши, щелчок мыши и т.д.) Метод – это процедура, которая определена как часть класса и содержится в нем. Методы манипулируют полями и свойствами классов (хотя могут работать и с любыми переменными) и имеют автоматический доступ к любым полям и методам своего класса. Методы можно создавать как визуальными средствами, так и путем написания кода вручную. Методы подразделяют на статические и виртуальные. Виртуальный отличается тем, что реализующий его код подсоединяется к исполняемой программе не в процессе компиляции, а в процессе выполнения. Это дает возможность строить иерархию объектов с одинаковыми названиями методов, но реализуемых различными кодами. {в процессе компиляции проекта создается готовый к использованию файл} Конструктор – это специальный метод, инициализирующий объект, содержащий виртуальные методы, он объявляется специальным словом constructor. Он инициализирует объект путем установления связи между объектом и специальной таблицей виртуальных методов, содержащей адреса кодов, реализующих виртуальные методы. Деструктор – специальный метод, выполняющий действия, обратные действиям конструктора (заголовок - destructor). Он освобождает память «кучи» от динамических объектов (динамические переменные размещаются в памяти только на время). Инкапсуляция – объединение данных и обрабатывающих их методов внутри класса (объекта). – это объединение в одном понятии информации о свойствах некоторого объекта и действиями над ними. Наследование – это процесс порождения новых объектов-потомков от существующих объектов-родителей, при этом потомок наследует от родителей все его поля, свойства, методы. В дальнейшем наследуемые поля можно использовать в неизменном виде или модифицировать. Полиморфизм заключается в том, что методы различных классов могут иметь одинаковые имена, но различное содержание. Это достигается переопределением родительского метода в классе-потомке. В результате родитель и потомок ведут себя различно. При этом обращение к одноименным методам различных объектов выполняется аналогично. Т.е. это задание одного имени действию, кот. передается вверх и вниз по иерархии объектов, с реализацией этого действия способом, соответствующим каждому объекту в иерархии.

  1. Основные понятия объектно-ориентированного программирования

Объектно-ориентированная среда программирование создает окружение в виде множества независимых объектов. Каждый объект ведет себя подобно отдельному компьютеру, их можно использовать в решении задач как «черные ящики», не вникая во внутренние механизмы их функционирования.

Объектно-ориентированная методология проектирования программ основана на концепциях упрятывания информации и абстрактных типов данных. Такой подход рассматривает все такие ресурсы как данные, модули и системы в качестве объектов. Каждый объект содержит некоторую структуру данных (или тип данных), обрамленную набором процедур (методов), предназначенных для манипулирования этими данными. Программист может создать свой абстрактный тип данных и отобразить проблемную область в эти созданные им абстракции вместо традиционного отображения проблемной области в предопределенные структуры данного языка. Можно сконцентрироваться на проекте системы, не беспокоясь о деталях объектов, используемых в системе.

Этапы разработки программы: 1) определить задачу; 2) подобрать необходимые объекты; 3) с помощью объектов создается внешний интерфейс программы, настраивается, затем описывается процедуры для каждого объекта.

Класс - это категория объектов, обладающих одинаковыми свойствами и поведением. При этом объект представляет собой просто экземпляр какого-либо класса. Например, в Delphi тип “форма” (окно) является классом, а переменная этого типа - объектом. Объект – это структура данных, содержащая поля данных (аналогично типу запись Record) различных типов и заголовки методов. Свойство – это атрибут объекта, определяющий то, как объект выглядит или как он может вести себя. Событие –свойство процедурного типа, предназначенное для обеспечения реакции на те или иные действия. Например, воздействие пользователя на мышь или клавиатуру (движение мыши, щелчок мыши и т.д.) Метод – это процедура, которая определена как часть класса и содержится в нем. Методы манипулируют полями и свойствами классов (хотя могут работать и с любыми переменными) и имеют автоматический доступ к любым полям и методам своего класса. Методы можно создавать как визуальными средствами, так и путем написания кода вручную. Методы подразделяют на статические и виртуальные. Виртуальный отличается тем, что реализующий его код подсоединяется к исполняемой программе не в процессе компиляции, а в процессе выполнения. Это дает возможность строить иерархию объектов с одинаковыми названиями методов, но реализуемых различными кодами. {в процессе компиляции проекта создается готовый к использованию файл} Конструктор – это специальный метод, инициализирующий объект, содержащий виртуальные методы, он объявляется специальным словом constructor. Он инициализирует объект путем установления связи между объектом и специальной таблицей виртуальных методов, содержащей адреса кодов, реализующих виртуальные методы. Деструктор – специальный метод, выполняющий действия, обратные действиям конструктора (заголовок - destructor). Он освобождает память «кучи» от динамических объектов (динамические переменные размещаются в памяти только на время). Инкапсуляция – объединение данных и обрабатывающих их методов внутри класса (объекта). – это объединение в одном понятии информации о свойствах некоторого объекта и действиями над ними. Наследование – это процесс порождения новых объектов-потомков от существующих объектов-родителей, при этом потомок наследует от родителей все его поля, свойства, методы. В дальнейшем наследуемые поля можно использовать в неизменном виде или модифицировать. Полиморфизм заключается в том, что методы различных классов могут иметь одинаковые имена, но различное содержание. Это достигается переопределением родительского метода в классе-потомке. В результате родитель и потомок ведут себя различно. При этом обращение к одноименным методам различных объектов выполняется аналогично. Т.е. это задание одного имени действию, кот. передается вверх и вниз по иерархии объектов, с реализацией этого действия способом, соответствующим каждому объекту в иерархии.

  1. Язык программирования Delphi: общие сведения, основные объекты, их методы, свойства и события.

в 1996 г. фирма Borland, известная своими разработками в области реализации языков программирования, выпустила компилятор нового поколения Delphi. Прежде всего, это мощный компилятор языка Паскаль, дополненного рядом существенно новых возможностей для программирования в среде Windows. Delphi - это система, имеющая интерфейс качественно нового типа, позволяющий при составлении текста программы видеть те графические объекты, для которых она пишется - так называемая, система визуального программирования. Delphi является системой программирования очень высокого уровня. Она берет на себя значительную часть работы по управлению компьютером, что делает возможным в простых случаях обходиться без особых знаний о деталях ее работы. В отличие от традиционных систем программирования, Delphi даже «сама» пишет значительную часть текста программы: описания объектов, заголовки процедур и многое другое. Программисту остается только вписать необходимые строчки, определяющие индивидуальное поведение программы, которые система не в состоянии предугадать. Но даже здесь Delphi во многих случаях сама указывает место, где надо разместить эти строки. Вершиной автоматизации процесса программирования являются, так называемые, эксперты. Эксперт - это диалоговое окно, которое помогает пользователю описать, что он хочет видеть в своей программе. Например, Эксперт проекта спрашивает, необходимо ли вам системное меню и какого из предложенных типов ваш проект. Проанализировав введенные ответы. Delphi пишет код программы на Паскале. Отметим, что эксперты могут быть созданы самим пользователем. Язык программирования, который использован в Delphi, называется Object Pascal (Объектный Паскаль).

В каждый момент времени объект характеризуется присущим именно ему набором свойств (properties) и методов (methods) – операций, совершаемых над другими объектами или данным объектом, а также реагирует на события (events).

Окно инспектора объектов (Object Inspector) отображает свойства какого-либо компонента, активизированного щелчком мышью, или самой формы. Имя активизированного компонента находится под заголовком окна. Именно с помощью инспектора объектов настраивают объекты, используемые в программах. Это же окно используется для выбора и настройки событий, на которые будут реагировать объекты нашей программы. С его помощью создаются или выбираются нужные процедуры обработки.

Окно проектировщика формы – главное место, где происходит сборка программы из компонентов, содержащихся в палитре компонентов. Сама форма – это уже готовая к выполнению программа. Вначале окно формы пустое, но, создавая программу, в указанное место формы добавляются объекты – экземпляры компонента выбранного типа. Сетка из точек в окне формы поможет разместить объекты ровно и аккуратно. При работе программы ее не видно. Каждая программа содержит хотя бы одно окно и, следовательно, одну форму. Поэтому при работе над программой окно формы мы видим на экране всегда. Заготовка первого окна называется Form1. Если в программе будет два окна, то заготовка второго будет называться Form2 и так далее. <Delphi продолжение>

Все компоненты можно разделить на визуальные и невизуальные.

Визуальные, в свою очередь, делятся на оконные элементы управления и графические элементы управления. Визуальные компоненты являются элементами управления, которые добавляются на форму: это кнопки, поля ввода, картинки, панели и т.д. Те из них, что предназначены для ввода данных, могут принимать фокус ввода, обеспечивая управление с клавиатуры. Невизуальные компоненты служат в основном для обеспечения более удобного доступа к определенным функциям системы. При добавлении их на форму на ней появляется иконка с изображением компонента, невидимая во время исполнения программы. В этом и заключается их «невизуальность». Несмотря на это, некоторые из них служат для обеспечения визуальных по природе эффектов. Например, к таким относятся компоненты меню и диалоги.

Визуальные компоненты составляют интерфейс программы. Визуальные компоненты имеют много общих свойств и событий, связанных, прежде всего, с их отображением на форме.

Некоторые конкретные компоненты и их предназначение.

Label (вывод надписей); Edit (ввод текста пользователем); Memo (lля работы с несколькими строками). Строки хранятся в свойстве Lines. Button (кнопка). CheckBox (для работы с пунктами). ComboBox (для выбора текста из нескольких альтернатив. Альтернативы хранятся в свойстве Items, аналогичном свойству Lines у компонента Memo). RadioGroup (множественный выбор). Panel (контейнер компонентов). Image (для работы с картинкой).

В Delphi все классы наследуются от одного предка – базового класса TObject. Этот класс не только дает всем своим потомкам ряд нужных всем им методов, например, методы создания и уничтожения экземпляров класса, но и обеспечивает базовую совместимость любых объектов. Все компоненты в Delphi – объекты. Можно создавать новые компоненты в Delphi.

События используются в Delphi для обеспечения определения программистом реакции на те или иные действия или запросы со стороны компонента.

Хотя описание обработчиков событий, по сути, является всего лишь полиморфным замещением методов, события в Delphi играют очень важную роль. Фактически вся программа – это описание обработчиков событий.

Программа Delphi не является сплошным последовательным выполнением кода, как в Turbo Pascal. Здесь программа реализует некоторый код только как реакцию на события – какие-то действия пользователя (нажатие кнопок, движение мыши, закрытие окон и т.п.). Когда код, описанный в обработчике, заканчивается, программа не завершается. Для завершения требуется, чтобы пользователь обычным в Windows способом закрыл главное окно приложения либо, к примеру, нажал на сделанную кнопку, в обработчике нажатия которой предусмотрен вызов процедуры Close.

  1. Разработка проектов в Delphi: соглашения об именах, редактор кода, создание процедур пользователя, запись основных исполнимых операторов

Проектирование форм – ядро визуальной разработки в среде Delphi. Каждый помещаемый в форму компонент или любое задаваемое свойство сохраняется в файле, описывающем форму (DFM-файл), а также оказывает некоторое влияние на исходный текст, связанный с формой (PAS-файл). Можно начать новый пустой проект, создав пустую форму, или начать с существующей формы (используя различные доступные шаблоны), или добавить в проект новые формы. Проект (приложение) может иметь любое число форм. При работе с формой можно обрабатывать свойства самой формы, свойства одного из ее компонентов или нескольких компонентов одновременно.

Каждая страница палитры содержит ряд компонентов, которые обозначены пиктограммами и именами, появляющимися в виде подсказки. Эти имена являются официальными названиями компонентов. В действительности это названия классов, описывающих компоненты без первой буквы T (например, если класс называется Tbutton, имя будет Button). При проектировании формы в Delphi обычно приходится писать кое-какой код для отклика на некоторые из ее событий. Когда вы нажимаете кнопку мыши в форме или на компоненте, Windows посылает вашему приложению сообщение, информируя его об этом событии. Реакция Delphi состоит в получении сообщения о событии и вызове соответствующего метода отклика на событие. Для каждого вида компонентов Delphi определяет ряд различных событий. Вы можете узнать о событиях, доступных для формы или компонента, рассматривая страницу Events окна Object Inspector в тот момент, когда выбран необходимый элемент.

Чтобы заставить программу реагировать на нажатие кнопки, необходимо написать на языке Object Pascal фрагмент программы, который называется обработчиком события. Фрагмент оформляется в виде специальной подпрограммы – процедуры.

Каждый компонент принадлежит к строго определенному классу, а все конкретные экземпляры компонентов, вставляемые в форму, получают имя класса с добавленным числовым индексом. По используемому в Delphi соглашению все имена классов начинаются с буквы Т. Таким образом, имя TForm1 означает имя класса с добавленным числовым индексом, созданного по образцу стандартного класса Tform.

Каждый раз, когда вы работаете над событием, Delphi открывает редактор с исходным файлом, связанным с формой. Редактор позволяет работать над несколькими файлами исходного текста одновременно, используя образ “записной книжки с ярлычками”. Каждая страница записной книжки соответствует отдельному файлу.

Отдельными разделами модуля являются имя модуля, интерфейс, содержащий объявления типов, объявления переменных и объявления констант при необходимости. Заключительная часть модуля, после слова implementation (реализация), является разделом, где объявляются создаваемые пользователем типы, переменные, константы и процедуры. Работают с кодом в разделе implementation.

Если модуль связан с модулем данных или формами, то обязательно будет присутствовать директива компиляции ресурсов $R, за которой непосредственно следует ключевое слово implementation. Ключевое слово end определяет конец файла. Можно ставить ключевые слова initialization (инициализация) и finalization (заключение), которые не генерируются автоматически. Код инициализации должен исполняться перед всеми остальными кодами, а заключительный код должен быть самым последним в модуле. Код инициализации исполняется при загрузке модуля в память, а заключительный код — перед выгрузкой модуля из памяти.

26 Неформальное описание понятий алгоритма и (алгоритмически) вычислимой функции. Задачи, требующие уточнения понятия алгоритма. Различные подходы к уточнению понятию алгоритма (рекурсивные функции, машины Тьюринга, алгорифмы Маркова, системы Поста).

АЛГОРИТМ – система правил, сформулированная на понятном исполнителю языке, которая определяет процесс перехода от допустимых исходных данных к некоторому результату и обладает свойствами массовости, конечности, определенности, детерминированности.

На протяжении многих веков понятие алгоритма связывалось с числами и относительно простыми действиями над ними, да и сама математика была, по большей части, наукой о вычислениях, наукой прикладной. Чаще всего алгоритмы представлялись в виде математических формул. Порядок элементарных шагов алгоритма задавался расстановкой скобок, а сами шаги заключались в выполнении арифметических операций и операций отношения (проверки равенства, неравенства и т.д.). Часто описания были громоздкими, а вычисления вручную – трудоемкими, но суть самого вычислительного процесса оставалась очевидной. У математиков не возникала потребность в осознании и строгом определении понятия алгоритма, в его обобщении. Но с развитием математики появлялись новые объекты, которыми приходилось оперировать: векторы, графы, матрицы, множества и др. Как определить для них однозначность или как установить конечность алгоритма, какие шаги считать элементарными? В 1920-х задача точного определения понятия алгоритма стала одной из центральных проблем математики. В то время существовало две точки зрения на математические проблемы: 1. Все проблемы алгоритмически разрешимы, но для некоторых алгоритм еще не найден, поскольку еще не развиты соответствующие разделы математики. 2. Есть проблемы, для которых алгоритм вообще не может существовать.

Идея о существовании алгоритмически неразрешимых проблем оказалась верной, но для того, чтобы ее обосновать, необходимо было дать точное определение алгоритма. Попытки выработать такое определение привели к возникновению теории алгоритмов, в которую вошли труды многих известных математиков – К.Гедель, К.Черч, С.Клини, А.Тьюринг, Э.Пост, А.Марков, А.Колмогоров и многие другие.

Точное определение понятия алгоритма дало возможность доказать алгоритмическую неразрешимость многих математических проблем.

Появление первых проектов вычислительных машин стимулировало исследование возможностей практического применения алгоритмов, использование которых, ввиду их трудоемкости, было ранее недоступно. Дальнейший процесс развития вычислительной техники определил развитие теоретических и прикладных аспектов изучения алгоритмов.

В теории алгоритмов предполагается, что каждый шаг алгоритма таков, что его может выполнить достаточно простое устройство (машина), Желательно, чтобы это устройство было универсальным, т.е. чтобы на нем можно было выполнять любой алгоритм. Механизм работы машины должен быть максимально простым по логической структуре, но настолько точным, чтобы эта структура могла служить предметом математического исследования. Впервые это было сделано американским математиком Эмилем Постом в 1936 (машина Поста) еще до создания современных вычислительных машин и (практически одновременно) английским математиком Аланом Тьюрингом (машина Тьюринга).

История конечных автоматов: машина Поста и машина Тьюринга. Машина Поста – абстрактная вычислительная машина, предложенная Постом (Emil L.Post), которая отличается от машины Тьюринга большей простотой. Обе машины «эквивалентны» и были созданы для уточнения понятия «алгоритм».

Абстрактная машина Поста представляет собой бесконечную ленту, разделенную на одинаковые клетки, каждая из которых может быть либо пустой, либо заполненной меткой «V». У машины есть головка, которая может перемещаться вдоль ленты на одну клетку вправо или влево, наносить в клетку ленты метку, если этой метки там ранее не было, стирать метку, если она была, либо проверять наличие в клетке метки. Информация о заполненных метками клетках ленты характеризует состояние ленты, которое может меняться в процессе работы машины. В каждый момент времени головка находится над одной из клеток ленты и, как говорят, обозревает ее. Информация о местоположения головки вместе с состоянием ленты характеризует состояние машины Поста. Работа машины Поста заключается в том, что головка передвигается вдоль ленты (на одну клетку за один шаг) влево или вправо, наносит или стирает метки, а также распознает, есть ли метка в клетке в соответствии с заданной программой, состоящей из отдельных команд.

Еще одним подходом к проблеме формализации понятия алгоритма являются, так называемые, рекурсивные функции. Исторически этот подход возник первым, поэтому в математических исследованиях, посвященных алгоритмам, он имеет наибольшее распространение.

Рекурсией называется способ задания функции, при котором значение функции при определенном значении аргументов выражается через уже заданные значения функции при других значениях аргументов. Применение рекурсивных функций в теории алгоритмов основано на идее нумерации слов в произвольном алфавите последовательными натуральными числами. Таким образом любой алгоритм можно свести к вычислению значений некоторой целочисленной функции при целочисленных значениях аргументов.

  1. Машина Тьюринга. Устройство. Состояние машины. Конфигурация

Машина Тьюринга состоит из счетной ленты (разделенной на ячейки и ограниченной слева, но не справа), читающей и пишущей головки, лентопротяжного механизма и операционного исполнительного устройства, которое может находиться в одном из дискретных состояний q0, q1, …, qs , принадлежащих некоторой конечной совокупности (алфавиту внутренних состояний), при этом q0 называется начальным состоянием. Читающая и пишущая головка может читать буквы рабочего алфавита A = {a0, a1, …, at }, стирать их и печатать. Каждая ячейка ленты в каждый момент времени занята буквой из множества А. Чаще всего встречается буква а0 – «пробел». Головка находится в каждый момент времени над некоторой ячейкой ленты – текущей рабочей ячейкой. Лентопротяжный механизм может перемещать ленту так, что головка оказывается над соседней ячейкой ленты, при этом возможна ситуация выхода за левый край ленты, которая является аварийной (недопустимой), или машинного останова, когда машина выполняет предписание об остановке.

Машина Тьюринга (МТ) — абстрактный исполнитель (абстрактная вычислительная машина). Была предложена Аланом Тьюрингом в 1936 году для формализации понятия алгоритма. Машина Тьюринга является расширением конечного автомата и, согласно тезису Чёрча — Тьюринга, способна имитировать все другие исполнители (с помощью задания правил перехода), каким-либо образом реализующие процесс пошагового вычисления, в котором каждый шаг вычисления достаточно элементарен.

Устройство машины Тьюринга

В состав машины Тьюринга входит бесконечная в обе стороны лента (возможны машины Тьюринга, которые имеют несколько бесконечных лент), разделённая на ячейки, и управляющее устройство, способное находиться в одном из множества состояний. Число возможных состояний управляющего устройства конечно и точно задано.

Управляющее устройство может перемещаться влево и вправо по ленте, читать и записывать в ячейки ленты символы некоторого конечного алфавита. Выделяется особый пустой символ, заполняющий все клетки ленты, кроме тех из них (конечного числа), на которых записаны входные данные.

Управляющее устройство работает согласно правилам перехода, которые представляют алгоритм, реализуемый данной машиной Тьюринга. Каждое правило перехода предписывает машине, в зависимости от текущего состояния и наблюдаемого в текущей клетке символа, записать в эту клетку новый символ, перейти в новое состояние и переместиться на одну клетку влево или вправо. Некоторые состояния машины Тьюринга могут быть помечены как терминальные, и переход в любое из них означает конец работы, остановку алгоритма.

Машина Тьюринга называется детерминированной, если каждой комбинации состояния и ленточного символа в таблице соответствует не более одного правила. Если существует пара «ленточный символ — состояние», для которой существует 2 и более команд, такая машина Тьюринга называется недетерминированной.

Описание машины Тьюринга

Конкретная машина Тьюринга задаётся перечислением элементов множества букв алфавита A, множества состояний Q и набором правил, по которым работает машина. Они имеют вид: qiaj→qi1aj1dk (если головка находится в состоянии qi, а в обозреваемой ячейке записана буква aj, то головка переходит в состояние qi1, в ячейку вместо aj записывается aj1, головка делает движение dk, которое имеет три варианта: на ячейку влево (L), на ячейку вправо (R), остаться на месте (N)). Для каждой возможной конфигурации <qi, aj> имеется ровно одно правило. Правил нет только для заключительного состояния, попав в которое машина останавливается. Кроме того, необходимо указать конечное и начальное состояния, начальную конфигурацию на ленте и расположение головки машины.

Тезис Тьюринга - всякий алгоритм представим в форме машины Тьюринга.

  1. Нормальные алгоритмы Маркова. Сравнение алгоритмических схем Маркова и Тьюринга.

Нормальный алгоритм Маркова — один из стандартизованных вариантов представления об алгоритме. Понятие нормального алгоритма введено А.А. Марковым в конце 1940-х годов.

Нормальный алгоритм Маркова - математическое построение, предназначенное для уточнения понятия алгоритм. Нормальный алгоритм Маркова:  - задается алфавитом и нормальной схемой подстановок, выполняемых по заранее определенной схеме;  - определяет преобразование строк.  Доказано, что класс нормальных алгоритмов Маркова и класс алгоритмов, представленных в форме машины Тьюринга, совпадают.

Алгоритм Маркова

Нормальный алгоритм Маркова - вещь довольно известная в теории алгоритмов. Имеется некоторый набор символов (алфавит), и строка из этих символов. Кроме того, имеем правила замены, в каждом из которых указано, какую подстроку с исходной строке нужно заменить, и на что ее менять. Подстроки могут быть и пустыми. Порядок правил фиксирован. Функционирует все следующим образом. Правила просматриваются в указанном порядке на предмет применимости. Первое же правило, которое может быть применено, однократно применяется (то есть выполняется описанная в нем замена), после чего цикл обработки повторяется (список просматривается заново). "Однократно" означает, что если в строке к моменту выполнения правила существует несколько подстрок, которые могут быть заменены, то заменяется только одна подстрока из возможных, а именно - самая левая. Процесс заканчивается, если после очередного просмотра строка не изменилась. В процессе выполнения замен длина строки может изменяться, увеличиваться, уменьшаться.  Пример: Есть строка ababaab И набор правил ab->c cc->ab В результате применения описанной процедуры строка будет преобразована в cac. При этом будут получаться такие промежуточные результаты: ababaab, cabaab, ccaab, ccac, abac, cac.  Тезис Маркова

Для любого алгоритма в произвольном конечном алфавите А можно построить эквивалентный ему нормальный алгоритм.

Все известные до сих пор алгоритмы нормализуемы.

Сравнивая алгоритмические схемы Тьюринга и Маркова, можно отметить, что у машины Тьюринга сравнительно развито управление при слабых возможностях преобразования информации, тогда как в алгоритмической схеме Маркова богаче возможности преобразования информации при менее развитом управлении. Авторы обеих алгоритмических схем старались простыми средствами обеспечить возможность описания любых алгоритмов. Тьюринг достиг этой цели в первую очередь за счет упрощения действия, а Марков – за счет упрощения логики управления.

Алгоритмические схемы Маркова и Тьюринга эквивалентны в том смысле, что все алгоритмы, описываемые в одной из них, могут быть описаны в другой. Эти схемы не могут быть физически реализованы, поскольку они являются математической абстракцией, допускающей неограниченно большую длину слов, возникающих в процессе преобразований.

  1. Исходные функции. Операторы подстановки, примитивной рекурсии и минимизации. Примитивно рекурсивные, общеререкурсивные и частично рекурсивные функции. Тезис Чёрча.

Термин рекурсивные функции в теории вычислимости  используют для обозначения трёх множеств функций примитивно рекурсивные функции;

общерекурсивные функции; частично рекурсивные функции.

Последние совпадают с множеством вычислимых по Тьюрингу функций. Определения этих трёх классов сильно связаны. Они были введены Куртом Гёделем с целью формализации понятия вычислимости.

Множество частично рекурсивных функции включает в себя множество общерекурсивных функции, а общерекурсивные функции включают в себя примитивно рекурсивные функции. Частично рекурсивные функции иногда называют просто рекурсивными функциями.

Примитивно рекурсивные функции. Определение понятия примитивно рекурсивной функции является индуктивным. Оно состоит из указания класса базовых примитивно рекурсивных функций и двух операторов (подстановки и примитивной рекурсии), позволяющих строить новые примитивно рекурсивные функции на основе уже имеющихся.

К числу базовых примитивно рекурсивных функций относятся функции следующих трёх видов:

Нулевая функция O — функция без аргументов, всегда возвращающая 0.

Функция следования S одного переменного, сопоставляющая любому натуральному числу x непосредственно следующее за ним натуральное число x + 1.

Функции Imn?, где 0<m=<n , от n переменных, сопоставляющие любому упорядоченному набору x1…xn  натуральных чисел, число xm из этого набора.

Операторы подстановки и примитивной рекурсии определяются следующим образом:

Оператор подстановки. Пусть f — функция от m переменных, аg1…gm   — упорядоченный набор функций от n переменных каждая. Тогда результатом подстановки функций gk в функцию f называется функция h от n переменных, сопоставляющая любому упорядоченному набору  x1…xn   натуральных чисел

h(x1…xn  )=f(g1(x1…xn  )…gm(x1…xn  ))

Оператор примитивной рекурсии. Пусть f — функция от n переменных, а g — функция от n + 2 переменных. Тогда результатом применения оператора примитивной рекурсии к паре функций f и g называется функция h от n + 1 переменной вида

h(x1…xn ,0 )=f(x1…xn)

h(x1…xn ,y+1 )=g(x1…xn, y, h(x1…xn,y)

Множество примитивно рекурсивных функций — это минимальное множество, содержащее все базовые функции и замкнутое относительно указанных операторов подстановки и примитивной рекурсии.