КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Преимущества и недостатки рекурсивных алгоритмов
End. Solution(n, b) End End Then begin End Then begin End Then begin Begin Иначе решений нет. End HanojTower(N-1, 6-I-J, J) Else begin Then Step(I, J) Begin If N = 1 HanojTower(N-1, I, 6-I-J); Step(I, J); End;
Определим сложность алгоритма по времени T(n) в терминах количества шагов (вызовов Step), выписав рекуррентное соотношение: T(n) = 2T(n-1) + 1 Легко показать, что T(n) = 2n - 1.
Пример 8. Линейные диофантовы уравнения. Перечислить все неотрицательные целые решения линейного уравнения a1x1 + a2x2 +... + anxn = b c целыми положительными коэффициентами. Перепишем исходное уравнение в виде: a1 x1 + a2 x 2 +... + a n-1 x n-1 = b - a n x n Организуем перебор всевозможных значений xn, при которых правая часть b-a n x n > 0. xn = 0, 1,... y, где y = b div an. Тогда первые n-1 компонент решения (x1,..., x n-1, x n) исходного уравнения - решение уравнения a1 x1 + a2 x2 +... + a n-1 x n-1 = b - a n x n. Таким образом, мы свели решение исходного уравнения к решению y+1 уравнения с n-1 неизвестным, и, следовательно, можем реализовать алгоритм рекурсивно. Определим условия выхода из рекурсии: при b = 0 существует единственное решение - (0, 0,..., 0) при n = 1 если b mod a1 = 0 то x1 = b div a1 Таким образом, выходить из рекурсивных вычислений нужно в двух (крайних) случаях. Мы установили и параметры процедуры: n и b, базис рекурсии, шаг рекурсии и условия рекурсии. Procedure Solution(n, b: integer); Var i, j, y, z: Integer; If b = 0 For j:= 1 to n do X[j]:= 0; WriteSolution else If (n = 1) and (b mod a[1] = 0) X[1]:= b div a[1]; WriteSolution else If n > 1 z:= a[n]; y:= b div z; For i:= 0 to y do begin X[n]:= i; Solution(n - 1, b - z*i) End; Program AllSolutions; Const n = 4; Type Vector = array[1..n] of Integer; Var a, X: Vector; b: Integer; i: Integer; {Procedure WriteSolution печатает решение X[1..n]} {Procedure Solution} Begin {раздел операторов основной программы} {Ввод массива a[1..n] и св. члена b}
Рассмотренные примеры показывают, что применение рекурсивных определений само по себе не приводит к хорошим решениям задач.
Так, задачи примеров 2, 3, 6, 7 допускают более эффективные и достаточно простые итеративные решения. В примере 6 это продемонстрировано особенно наглядно. В примерах 2, 3, 7 рекурсия моделирует простой цикл, тратя время на вычисления, связанные с управлением рекурсивными вызовами и память на динамическое хранение данных. Сложнее реализовать итеративную версию алгоритма примера 4. Несомненным достоинством алгоритмов из примеров 3, 5, 8 является их простота и обоснованность. При программировании мы по существу одновременно обосновывали правильность алгоритма. В примерах 5, 8, 9 рассматриваются комбинаторные задачи, решение которых не сводится к простому применению цикла, а требует перебора вариантов, естественным образом управляемого рекурсивно. Итеративные версии решений этих задач сложнее по управлению. Можно сказать, что основная вычислительная сложность комбинаторной задачи заключена не в реализации алгоритма ее решения, а в самом методе решения. Позже мы увидим, как рекурсия в сочетании с другими методами используется для построения эффективных алгоритмов.
Дата добавления: 2014-01-06; Просмотров: 2180; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |