Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.