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

5. Рекурсивные функции и алгоритмы. Примеры рекурсивных алгоритмов и программ

Ситуацию, когда функция тем или иным образом вызывает саму себя, называют рекурсией. Рекурсия, когда функция обращается сама к себе непосредственно, называется прямой; в противном случае она называется косвенной.

Все функции языка С++ (кроме функции main) могут быть использованы для построения рекурсии.

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

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

Если попытаться отследить по тексту программы процесс выполнения рекурсивной функции, то мы придем к такой ситуации: войдя в рекурсивную функцию, мы “движемся” по ее тексту до тех пор, пока не встретим ее вызова, после чего мы опять начнем выполнять ту же самую функцию сначала. При этом следует отметить самое важное свойство рекурсивной функции - ее первый вызов еще не закончился. Чисто внешне создается впечатление, что текст функции воспроизводится (копируется) всякий раз, когда функция сама себя вызывает. На самом деле этот эффект воспроизводится в компьютере. Однако копируется при этом не весь текст функции (не вся функция), а только ее части, связанные с данными (формальные, фактические параметры, локальные переменные и точка возврата). Алгоритм (операторы, выражения) рекурсивной функции не меняется, поэтому он присутствует в памяти компьютера в единственном экземпляре.

int fuck(int n) { 

if (n == 0) //Условие выхода из рекурсии return 1;

return n*fuck(n - 1); }

6. Основные структуры данных – линейные, односвязные и двусвязные списки. Основные операции. Примеры использования.

Список — совокупность данных, структурные свойства которой ограничены лишь относительным расположением элементов. Это множество неопределенной длины с элементами, которые могут иметь как тождественный тип, так и разные типы.

Характерной особенностью списка является то, что физическое расположение элементов в памяти никак не связано с их логическим положением. В массиве, если i>j, то ai физически расположен в памяти раньше, чем aj. В списке этого не соблюдается. Сначала может в физической памяти располагаться a1, потом a100, потом a37 и т.д. Но заданные между элементами связи определяют их истинный последовательный логический порядок. В этом состоит принципиальное отличие списка от массива.

С амый простой способ связать множество элементов — сделать так, чтобы каждый элемент содержал ссылку на следующий. Такой список называется однонаправленным (односвязным).

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

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

Над списками можно выполнять следующие операции:

начальное формирование списка (создание первого элемента);

добавление элемента в конец списка;

чтение элемента с заданным ключом;

вставка элемента в заданное место списка (до и после элемента с заданным ключом);

объединение двух списков;

разбиение списка на два различных списка;

удаление части списка;

проход по списку;

поиск элемента в списке;

создание копии списка;

определение количества элементов в списке;

удаление элемента с заданным ключом;

упорядочивание списка по ключу;

удаление списка.

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