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

Сравнение рекурсии и итерации

Итерация и рекурсия основаны на управляющих структурах: итерация использует структуру повторения, рекурсия использует структуру ветвления.

И итерация, и рекурсия подразумевают повторение: итерация использует структуру повторения явным образом, рекурсия – посредством повторных вызовов подпрограммы.

Итерация и рекурсия включают проверку на завершение: итерация завершается, когда перестаёт выполняться условие продолжения цикла, рекурсия завершается, когда распознаётся нерекурсивный случай.

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

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

Рекурсия имеет отрицательные стороны. Она многократно инициализирует механизм вызова подпрограммы и увеличивает связанные с ним расходы процессорного времени и памяти (каждое рекурсивное обращение создаёт копию её параметров и локальных объектов). Итерация обычно происходит в пределах подпрограммы, так что здесь нет расходов на повторные вызовы подпрограммы и дополнительное выделение памяти. Отладка рекурсивной подпрограммы вызывает большие трудности, чем отладка итерационной подпрограммы.

Любые рекурсивные процедуры и функции, содержащие всего один рекурсивный вызов самих себя, легко заменяются итерационными циклами. Чтобы получить что-то, не имеющее простого нерекурсивного аналога, следует обратиться к процедурам и функциям, вызывающим себя два и более раз. В этом случае множество вызываемых процедур образует уже не цепочку, а целое дерево. Существуют широкие классы задач, когда вычислительный процесс должен быть организован именно таким образом. Как раз для них рекурсия будет наиболее простым и естественным способом решения. (Алгоритмы обхода дерева, синтаксический анализ арифметических выражений, некоторые алгоритмы сортировки, задачи на графах, фракталы и т.д.)

Рекурсивная программа построения снежинки

Написать программу, строящую на экране изображение:

Изображение строится по следующему правилу: строится окружность с заданным радиусом r. Затем на диаметрально противоположных точках окружности ( x- r и x+ r)строится вновь окружность меньшего радиуса ( r=3 r/5). Для каждой меньшей окружности на диаметрально противоположных точках вновь строится окружность меньшего радиуса, и т.д., пока радиус не уменьшится до 10.

Пример рекурсивной программы построения окружностей

program recurs; 

uses graph; 

var x,y,r,d,m:integer; 

procedure ris(x,y,r:integer); 

var i:integer; 

begin 

   if r<10 then exit; 

   circle(x,y,r); 

   for i:=1 to 1000 do; { просто цикл задержки } 

   ris(x+r,y,r*3 div 5); 

   ris(x-r,y,r*3 div 5); 

end ; 

begin {начало основной программы} 

   d:=detect; 

   initgraph(d,m,'e:\bp\bgi'); 

   x:=320; 

   y:=240; 

   r:=120; 

   ris(x,y,r); 

   readln ; 

end.