![]() ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Занятие 3. Косвенная рекурсия.Рассмотренные выше программы использовали так называемую прямую рекурсию, когда в теле некоторой процедуры содержался непосредственный вызов самой себя. В языке Паскаль допускается также и косвенная рекурсия, когда, например, процедура, процедура А вызывает процедуру В, а та, в свою очередь,– процедуру А. Длина таких цепочек вызовов может быть произвольной, однако при разработке программы необходимо тщательно следить за тем, чтобы рекурсивный алгоритм был сходимым, то есть не приводил к бесконечным взаимным вызовам подпрограмм. Образно косвенную рекурсию можно описать так. Перед зеркалом 1 стоит зеркало 2, в котором отражается само зеркало 1. В последнем видно зеркало 2 и т.д. Приведем пример программы, иллюстрирующей косвенные рекурсивные вызовы процедур. В этой программе процедуры Rec1 и Rec2 рекурсивно вызывают друг друга, поочередно уменьшая свои фактические параметры. Легко видеть, что обе процедуры работают с одной глобальной переменной А, которая передается в них по ссылке. Критерием завершения работы является обращение этой переменной в ноль. Обратите внимание, что в программе необходимо предварительное определение второй процедуры Rec2, так как ее вызов встречается в процедуре Rec1, т.е. перед ее полным описанием. Program KosvRecurs; Var A: integer;
Procedure Rec2 (Var Y:integer); Forward; {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} Procedure Rec1 (Var X:integer); Begin X:= X-1; if X>0 then Rec2; writeln (X) End; {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} Procedure Rec2 (Var Y:integer); Begin Y:= Y div 2; if Y>2 then Rec1; writeln (Y) End; {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} Begin A:= 15; Rec1(A); End. Творческое задание. Придумайте и решите задачу на демонстрацию косвенной рекурсии в графическом режиме. Не нашли, что искали? Воспользуйтесь поиском:
|