Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_k_gosam (1).doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
4.61 Mб
Скачать

16. Понятие рекурсии. Прямая и косвенная рекурсии.

Понятие рекурсии

Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя. Факториал — это классический пример рекурсивного объекта. Факториал числа п — это произведение целых чисел от 1 до п. Обозначается факториал числа п так: n!.

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

В информатике рекурсия используется как практически ориентированное знание - некий мощный и изящный инструмент для реальных вычислений.

Понятие рекурсии не является сложным для начального понимания и не связано со знанием какого-либо определенного формализма или специальной нотации. Под рекурсией понимают прием последовательного сведения решения некоторой задачи к решению совокупности “более простых” задач такого же класса и получению на этой основе решения исходной задачи. Иногда на рекурсию смотрят как на наличие в определении объекта ссылки на сам объект. Или, в более общем случае, как на наличии в определениях упорядоченного мно­жества объектов последовательности ссылок друг на друга, замыкающихся на начальный объект. В программировании это выражается в построении программ (процедур или функций), которые при выполнении обращаются сами к себе непосредственно или через цепочку других программ. Кажущаяся при этих самовызовах или последовательных циклических вызовах видимость порочного круга не более чем иллюзия. Во многих конкретных случаях простыми рассуждениями путем отслеживания значений одной или нескольких управляющих величин удается провести доказательство завершимости вычислений за конечное число шагов.

Алгоритм называется рекурсивным, если в его определении содержится прямой или косвенный вызов этого же алгоритма. Вычисления, проводимые с помощью рекурсивных алгоритмов (процедур, функций) называют рекурсивными. Различают два основных вида рекурсии: прямая и косвенная. Под прямой рекурсией понимается непосредственный вызов алгоритма (функции, процедуры) F из текста самого алгоритма F. При косвенной рекурсии мы имеем циклическую последовательность вызовов нескольких алгоритмов F1, F2, …, Fk  (функций, процедур) друг друга: F1 вызывает F2, F2 вызывает F3, …, Fk вызывает F1 (k>1).

17. Структура типов данных языков программирования.

Тип данных (встречается также термин вид данных) — понятие из теории программирования. Тип данных определяет множество значений и операций, которые могут быть применены к этим значениям. Например, если переменная имеет числовой тип данных, то таким образом определён диапазон значений, которые могут быть сохранены в этой переменной (чи́сла) и определены операции, которые могут быть применены к этой переменной (арифметические). Каждый язык программирования поддерживает один или несколько встроенных типов данных (см. классификацию типов данных). Объектно-ориентированный язык программирования предоставляет возможность создавать на их основе пользовательские типы данных, называемые обычно классами. Типизация — жесткая связка операций и типов объектов, над которыми их можно выполнять. Таким образом для выполнения некоторой операции объект должен явно или неявно преобразован к необходимому типу. Это увеличивает уверенность программиста в том, что операция даст ожидаемый результат, в противном случае она попросту не выполнится. В общем говоря, в памяти компьютера хранятся только последовательности битов. Если имя переменной указывает адрес в памяти, по которому хранится информация, то тип данных (тип переменной) указывает, каким образом следует обращаться с этой информацией, то есть с битами, находящимися по данному адресу. Преимущества от использования типов данных:

* Надёжность. Типы данных защищают от трёх видов ошибок:

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

2. Некорректная операция. Позволяет избежать попыток применения выражений вида «Hello world» + 1. Поскольку как уже говорилось все переменные в памяти хранятся как наборы битов, то при отсутствии типов подобная операция была выполнима (и могла дать результат вроде «Hello worle»!). С использованием типов (см. далее «Контроль типов») такие ошибки отсекаются опять же на этапе компиляции.

3. Некорректная передача параметров. Если функция «синус» ожидает, что ей будет передан числовой аргумент, то передача ей в качестве параметра строки «Hello world» может иметь непредсказуемые последствия. При помощи контроля типов такие ошибки также отсекаются на этапе компиляции.

* Стандартизация. Благодаря соглашениям, касающихся типов, встроенных в системы программирования, сложилась ситуация, когда программисты могут быстро менять свои рабочие инструменты, а программы не требуют больших переделок при переносе исходных текстов в другую среду. К сожалению, стандартизации по универсальным типам данных ещё есть куда развиваться.

Классификация типов данных

Типы данных бывают следующие:

* Простые.

o Перечислимый тип. Может хранить только те значения, которые прямо указаны в его описании.

o Числовые. Хранятся числа. Могут применяться обычные арифметические операции.

+ Целочисленные: со знаком, то есть могут принимать как положительные, так и отрицательные значения; и без знака, то есть могут принимать только неотрицательные значения.

+ Вещественные: с фиксированной запятой, то есть хранятся знак и цифры целой и дробной частей и с плавающей запятой, то есть число приводится к виду m*2e, где m — мантисса, e — экспонента причем 1/2<=m<=1, а e — целое число и хранятся знак, и числа m и e.

o Символьный тип. Хранит один символ. Могут использоваться различные кодировки.

o Логический тип. Имеет два значения: истина и ложь. Могут применяться логические операции. Используется в операторах ветвления и циклах. В некоторых языках является подтипом числового типа, при этом ложь=0, истина=1.

o Множество. В основном совпадает с обычным математическим понятием множества. Допустимы стандартные операции с множествами и проверка на принадлежность элемента множеству. В некоторых языках рассматривается как составной тип.

* Составные (сложные).

o Массив. Является индексированным набором элементов одного типа. Одномерный массив — вектор, двумерный массив — матрица.

+ Строковый тип. Хранит строку символов. Может применяться операция конкатенация (сложение строк). Чаще всего рассматривается как массив символов, но иногда выделяется в качестве простого.

o Запись. Набор различных элементов (полей записи), хранимый как единое целое. Возможен доступ к отдельным полям записи.

o Файловый тип. Хранит только однотипные значения, доступ к которым осуществляется только последовательно (файл с произвольным доступом, включённый в некоторые системы программирования, фактически является неявным массивом).

* Другие типы данных. Если описанные выше типы данных представляли какие-либо объекты реального мира, то рассматриваемые здесь типы данных представляют объекты компьютерного мира, то есть являются исключительно компьютерными терминами.

o Указатель (тип данных). Хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.

o Ссылки (тип данных).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]