644
ГЛАВА 11. МЕТОДЫ, ОСНОВАННЫЕ НА РЕКУРСИИ
FloodFiLL4 ( x, y+1, OldColor, NewColor);
//переход к нижнему соседу
FloodFiLL4 ( x-1, y, OldColor, NewColor);
//переход к левому соседу
FloodFiLL4 ( x+1, y, OldColor, NewColor);
//переход к правому соседу
}
}
Процедура
FloodFill4
достаточно проста и будет часто (но не всегда, см.
упр. 1 ) работать правильно. Однако, хорошо ли она работает? Ответ на этот
вопрос весьма поучителен. При вызове ее для областей, содержащих значи-
тельное количество точек, расположенных по горизонталям и вертикалям,
FloodFill4
будет вызывать себя рекурсивно столько раз, сколько точек лежит
правее, левее, выше и ниже от текущей. К примеру, если правее текущей вну-
тренней точки в области находится 500 точек, то глубина рекурсии, появляю-
щейся только за счет первого внутреннего вызова процедуры, окажется рав-
ной 500, а значит одновременно будет существовать соответствующее число
экземпляров процедуры (из-за других рекурсивных вызовов это число ока-
жется еще больше).
Если удастся сократить рекурсию, то возможности применения процеду-
ры возрастут за счет снижения требований к памяти. Такое сокращение воз-
можно. Достаточно заметить, например, что для одного из направлений мож-
но заменить два рекурсивных вызова (вверх и вниз или влево и вправо) на два
цикла заполнения новым цветом соответствующей полосы области. При та-
кой замене нужно еще позаботиться о переходах к соседям по другому напра-
влению. Это можно сделать разными путями, но, вообще говоря, для продол-
жения процесса без запоминания в стеке или рекурсии точек-соседей полосы
(что, как уже говорилось, одно и то же) здесь не обойтись, что видно, в част-
ности, из рисунка 11.2а. Если первой внутренней точкой будет указана точка
А
, направление циклов горизонтальное, а после заполнения полосы в каче-
стве соседей для перехода к следующей полосе выбираются только верхние и
нижние соседи точки
А
, то верхние треугольники области, отделенные гори-
зонтальными штриховыми линиями, окажутся не закрашенными. Напротив,
для областей другой формы такой путь вполне правомерен (см. рис.11.2б), но
это уже нарушение условия задачи. Читателю предлагается самостоятельно
выяснить вопрос о том, когда можно, а когда нельзя ограничиваться выбором
соседей для продолжения процесса только теми точками, которые окружают