
Рекурсия
При решении сложных задач программирования эти задачи разбиваются на более простые подзадачи. Каждая из подзадач, в свою очередь, может быть разбита на еще более простые подзадачи, и т.д. Если задача в ходе такого последовательного разбиения свелась (необязательно за один шаг) сама к себе же самой, имеет место рекурсия.
Если задача сводится к себе, и еще раз к себе, и так далее, то количество обращений к себе должно быть конечным.
Каждое очередное сведение задачи к себе должно приближать задачу к тривиальному случаю. В тривиальном случае задача решается по алгоритму, который более не сводит задачу к себе.
Рекурсия используется во множестве стандартных алгоритмов. Далее, в курсе лекций, тема «Рекурсивные алгоритмы» будет возобновляться многократно.
Примеры
1.
.
Применяя по этой формуле сведение задачи
к себе
раз, можно «дойти» до тривиального
случая – до значения
,
а оно равно 1.
2.
.
Применение такого
сведения задачи к себе приводит к
«повисанию» машины. Теоретически, каждая
следующая рекурсия не приближает процесс
к тривиальному случаю. На практике такая
рекурсия достаточно быстро приведет к
арифметическому переполнению либо к
переполнению стека ввиду чрезмерно
большого числа экземпляров рекурсивно
вызываемого метода.
3. Числа Фибоначчи
выражаются «сами через себя» при
,
но выражаются явно (дают тривиальный
случай) при
и
:
,
,
,
.
Существует и явная формула для числа
Фибоначчи.
,
– Golden
Ratio.
Явная формула хороша для теоретических
исследований, но для получения числа
Фибоначчи на практике малопригодна.
Во-первых, ввиду ошибок округления
формула даёт нецелое число. Во-вторых,
количество арифметических операций и
время на их совершение по явной формуле
больше, чем по рекуррентному соотношению.
Сумма убывающей геометрической прогрессии
,
,
есть функциональный
(а именно, степенной, по степеням
переменной
)
ряд с коэффициентами 1, 1, … .
Полиномы Фибоначчи
являются коэффициентами разложения в
степенной ряд функции
,
.
Полиномы Фибоначчи
выражаются «сами через себя» при
,
но выражаются явно (дают тривиальный
случай) при
и
:
,
,
Связь с числами
Фибоначчи:
Пример рекурсивного метода
static double Fib(int n, double x)
{
if (n < 1)
return 0;
else
if (n == 1)
return 1;
else
if (n == 2)
return x;
else
return x * Fib(n-1, x) + Fib(n-2, x);
}
Пример рекурсивного метода. Ханойские башни.
static void HanoiTowers(int n, int x, int y, int z)
{
if (n == 1)
Console.WriteLine("{0} -> {1}", x, y);
else
{
HanoiTowers(n-1, x, z, y);
Console.WriteLine("{0} -> {1}", x, y);
HanoiTowers(n-1, z, y, x);
}
}