- •Лекция 9. Рекурсия Введение
- •Рекурсивные описания алгоритмов.
- •Реализация рекурсии
- •Примеры рекурсивных и нерекурсивных описаний
- •Var I: Integer; y: Real;
- •Var X:Integer;
- •Var s: Sequence;
- •Var I: Integer;
- •Var j : integer; Buf: Char;
- •Var s : Sequence;
- •Var j : integer;
- •Техника рекурсивных описаний
- •Var I, j, y, z : Integer;
- •Var a, X : Vector; b : Integer; I : Integer;
- •Преимущества и недостатки рекурсивных алгоритмов
Var a, X : Vector; b : Integer; I : Integer;
{Procedure WriteSolution печатает решение X[1..n]}
{Procedure Solution}
Begin {раздел операторов основной программы}
{Ввод массива a[1..n] и св. члена b}
Solution(n, b)
End.
Преимущества и недостатки рекурсивных алгоритмов
Рассмотренные примеры показывают, что применение рекурсивных определений само по себе не приводит к хорошим решениям задач.
Так, задачи примеров 2, 3, 6, 7 допускают более эффективные и достаточно простые итеративные решения. В примере 6 это продемонстрировано особенно наглядно.
В примерах 2, 3, 7 рекурсия моделирует простой цикл, тратя время на вычисления, связанные с управлением рекурсивными вызовами и память на динамическое хранение данных. Сложнее реализовать итеративную версию алгоритма примера 4.
Несомненным достоинством алгоритмов из примеров 3, 5, 8 является их простота и обоснованность. При программировании мы по существу одновременно обосновывали правильность алгоритма. В примерах 5, 8, 9 рассматриваются комбинаторные задачи, решение которых не сводится к простому применению цикла, а требует перебора вариантов, естественным образом управляемого рекурсивно. Итеративные версии решений этих задач сложнее по управлению. Можно сказать, что основная вычислительная сложность комбинаторной задачи заключена не в реализации алгоритма ее решения, а в самом методе решения.
Позже мы увидим, как рекурсия в сочетании с другими методами используется для построения эффективных алгоритмов.