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

Рекурсия

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

Если задача сводится к себе, и еще раз к себе, и так далее, то количество обращений к себе должно быть конечным.

Каждое очередное сведение задачи к себе должно приближать задачу к тривиальному случаю. В тривиальном случае задача решается по алгоритму, который более не сводит задачу к себе.

Рекурсия используется во множестве стандартных алгоритмов. Далее, в курсе лекций, тема «Рекурсивные алгоритмы» будет возобновляться многократно.

Примеры

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);

}

}

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