![]()
откуда очевидной индукцией получаем
.
Более сложные случаи рекурсии
Пусть функция
с натуральными аргументами и значениями определена рекурсивно условиями
![]()
где
- некоторое число, а
и
- известные функции. Другими словами, значение функции
в точке
выражается через значение
в точке
. При этом предполагается, что для любого
в последовательности
![]()
рано или поздно встретится
.
Если дополнительно известно, что
для всех
, то вычисление
не представляет труда: вычисляем последовательно ![]()
Написать нерекурсивную программу вычисления
для общего случая.
Решение. Для вычисления
вычисляем последовательность
![]()
до появления нуля и запоминаем ее, а затем вычисляем значения
в точках этой последовательности, идя справа налево.
Еще более сложный случай из следующей задачи вряд ли встретится на практике (а если и встретится, то проще рекурсию не устранять, а оставить). Но тем не менее: пусть функция
с натуральными аргументами и значениями определяется соотношениями
![]()
где
- некоторое число, а
,
и
- известные функции. Предполагается, что если взять произвольное число и начать применять к нему функции
и
в произвольном порядке, то рано или поздно получится
.
Написать нерекурсивную программу вычисления
.
Решение. Можно было бы сначала построить дерево, у которого в корне находится
, а в сыновьях вершины
стоят
и
- если только
не равно нулю. Затем вычислять значения функции, идя от листьев к корню. Однако есть и другой способ.
Обратной польской записью (или постфиксной записью ) выражения называют запись, где знак функции стоит после всех ее аргументов, а скобки не используются. Вот несколько примеров:

Постфиксная запись выражения позволяет удобно вычислять его с помощью
. Этот калькулятор имеет стек, который мы будем представлять себе расположенным горизонтально (числа вынимаются и кладутся справа), и клавиши - числовые и функциональные. При нажатии на клавишу с числом это число кладется в стек. При нажатии на функциональную клавишу соответствующая функция применяется к нескольким аргументам у вершины стека. Например, если в стеке были числа
![]()
и нажата функциональная клавиша
, соответствующая функции от двух аргументов, то в стеке окажутся числа
![]()
Перейдем теперь к нашей задаче. В процессе вычисления значения функции
мы будем работать со стеком чисел, а также с последовательностью чисел и символов f, l, r, h, которую мы будем интерпретировать как последовательность нажатий клавиш на стековом калькуляторе. Инвариант такой:

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

Здесь
,
,
- числа,
- последовательность чисел,
- последовательность чисел и символов f, l, r, h. В последней строке предполагается, что
. Эта строка соответствует равенству
![]()
Преобразования выполняются, пока последовательность не станет пуста. В этот момент в стеке окажется единственное число, которое и будет ответом.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
лгоритмы: построение и анализ. М.: Вильямс, 2007. труктуры данных и алгоритмы. М.: Вильямс, 2007. Окулов в алгоритмах. М.: Бином, 2007. скусство программирования. Т. 4 Вып.2. Генерация всех кортежей и перестановок. М.: Вильямс, 2008. скусство программирования. Т. 4 Вып.2. Генерация всех сочетаний и разбиений. М.: Вильямс, 2008. скусство программирования. Т. 4 Вып.2. Генерация всех деревьев. История комбинаторной генерации. М.: Вильямс, 2008. ундаментальные алгоритмы на С++. М.: Вильямс, 2011. Ху Т. Ч., Шинг алгоритмы Нижний Новгород: Изд-во Нижегородского госуниверситета им. , 2004. Новиков математика для программистов. СПб.: Питер, 2012.
СОДЕРЖАНИЕ
Введение 4
Тема 1. АЛГОРИТМЫ НА ГРАФАХ. 6
Лекция 1. Начальные понятия теории графов. 7
Лекция 2. Поиск в глубину и ширину. 21
Лекция 3. Эйлеровы и гамильтоновы циклы. 35
Тема 2. АЛГОРИТМЫ КОМБИНАТОРНОГО ПЕРЕБОРА. 48
Лекция 4. Базовые комбинаторные объекты. 49
Лекция 5. Коды Грея. 55
Лекция 6. Применение методов комбинаторного перебора. 61
Тема 3. ОБЩИЕ МЕТОДЫ РАЗРАБОТКИ АЛГОРИТМОВ. 66
Лекция 7. Обход дерева и перебор с возвратом. 67
Лекция 8. Рекурсия. 78
Лекция 9. Построение итеративных алгоритмов по рекурсивным. 90
БИБЛИОГРАФИЧЕСКИЙ СПИСОК 99
СТРУКТУРЫ И АЛГОРИТМЫ КОМПЬЮТЕРНОЙ
ОБРАБОТКИ ДАННЫХ
Курс лекций
Издается в авторской редакции
Подписано в печать 20.12.2013 Усл. п. л. – 7,25 Заказ 07 - 12 | Формат 84 x 108 1/32 Уч. –изд. л. – 7,45 Тираж 50 экз. |
Отпечатано в отделе оперативной полиграфии ВГГУ
600014, ,
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |


