Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

3.4. Циркулярные связанные списки и аннулирование списка 133

Предположим, что мы решаем заменить «Сидячую забастовку, Полную» «Ада Дискотеки». Мы

продвиньте курсор дважды так, чтобы «Сидячая забастовка, Живая», немедленно прибыла после курсора. Мы тогда удаляем этот вход и вставляем его замену.

международное основное ()

Плей-лист CircleList;

playList.add («Сидячая забастовка, Живая»); playList.add («Le Freak»); playList.add («Джайв Талкин»);

playList.advance (); playList.advance (); playList.remove (); playList.add («Ад Дискотеки»); возвратите ВЫХОДНОЙ УСПЕХ;

// // // //

// // // //

[] [сидячая забастовка, живая*] [Le Freak, сидячая забастовка, живая*] [джайв Талкин, Le Freak, сидячая забастовка, живая*]

[Le Freak, живая сидячая забастовка, джайв Талкин*] [живая сидячая забастовка, джайв Талкин, Le Freak*] [джайв Талкин, Le Freak*] [ад дискотеки, джайв Талкин, Le Freak*]

Кодовый Фрагмент 3.34: Используя класс CircleList, чтобы осуществить плей-лист для цифрового

аудиоплеер.

3.4.2 Изменение связанного списка

Как другой пример манипуляции связанных списков, мы представляем простую функцию

для изменения элементов вдвойне связанного списка. Учитывая список L, наш подход включает сначала копирование содержания L в обратном порядке во временный список T и затем копирование содержания T назад в L (но не полностью изменяя).

Достигнуть начальной буквы полностью изменило копию, мы неоднократно извлекаем первый элемент L и копируем его к фронту T. (Чтобы видеть, почему это работает, заметьте, что, чем позже элемент появляется в L, тем ранее это появится в T.), Чтобы скопировать содержание T назад к L, мы неоднократно извлекаем элементы из фронта T, но на сей раз мы копируем каждого к задней части списка L. Наш C ++ внедрение представлен в Кодовом Фрагменте 3.35.

пустота listReverse (DLinkedList& L)

DLinkedList T;

//полностью измените список//временный список

в то время как (! L.empty ())

натяните s = L.front (); L.removeFront ();

T.addFront (s);

//полностью измените L в T

в то время как (! T.empty ())

натяните s = T.front (); T.removeFront ();

L.addBack (s);

//скопируйте T назад к L

Кодовый Фрагмент 3.35: функция, которая полностью изменяет содержание вдвойне связанного списка L.

134 Глава 3. Множества, связанные списки и рекурсия

3.5 Рекурсия

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

Функция факториала

Чтобы иллюстрировать рекурсию, давайте начнем с простого примера вычисления ценности функции факториала. Факториал положительного целого числа n, обозначенного n!, определен как продукт целых чисел от 1 до n. Если n = 0, то n! определен как 1

соглашение. Более формально, для любого целого числа n³ 0,

n! =

1n (n- 1) (n- 2) 3 2 1

если n = 0, если n³ 1.

Например, 5! = 5 4 3 2 1 = 120. Сделать связь с функциями

более ясный, мы используем факториал примечания (n), чтобы обозначить n!.

Функция факториала может быть определена способом, который предлагает рекурсивную формулировку. Чтобы видеть это, наблюдайте это

факториал (5) = 5 (4 3 2 1) = 5 факториалов (4). Таким образом мы можем определить факториал (5) с точки зрения факториала (4). В целом, для положительного целого числа n, мы можем определить факториал (n), чтобы быть n факториал (n- 1). Это приводит

после рекурсивного определения

1 если n = 0

факториал (n) =

n факториал (n- 1) если n³ 1.

Это определение типично для многих рекурсивных определений. Во-первых, это содержит тот

или больше основных случаев, которые определены нерекурсивно с точки зрения фиксированных количеств. В этом случае, n = 0 основной случай. Это также содержит один или несколько рекурсивных случаев, которые определены, обратившись к определению определяемой функции. Обь - подача, что нет никакой округлости в этом определении, потому что каждый раз функция призван, ее аргумент, меньше одной.