Void RecCircle ( float x, float y, float R, int n )
{
float k = 0.5;
circle ( x, y, R ); // рисуемокружность
if ( n == 1 ) return; // все нарисовали, выход
RecCircle( x+R, y, k*R, n-1); // четыре рекурсивных вызова
RecCircle( x-R, y, k*R, n-1);
RecCircle( x, y+R, k*R, n-1);
RecCircle( x, y-R, k*R, n-1);
}
Процедура для рисования такой фигуры принимает 4 параметра – координаты центра базовой окружности (x,y), ее радиус Rи количество уровней n, которые надо нарисовать. На следующем уровне радиус изменяется в kраз (в примере – k=0.5), количество оставшихся уровней уменьшается на 1, и пересчитываются координаты для 4-х окружностей следующего уровня.Важно доказать, что рекурсия закончится. В самом деле, как видно из процедуры, при n = 1рекурсия заканчивается. При каждом новом рекурсивном вызове количество уровней n уменьшается на 1, поэтому если в самом начале n > 0, то оно достигнет значения 1 и рекурсия завершится. Для большей «защиты от дурака» лучше условие окончания рекурсии записать так:
if ( n <= 1 ) return;
Если этого не сделать, рекурсия никогда не завершится (теоретически), если в начале задали n < 1. Основная программа получается очень короткой – в ней надо открыть окно для графики, и один раз вызвать процедуру RecCircle.
#include <conio.h>
#include <graphics.h>
// сюда надо вставить процедуру
Main()
{
Initwindow(600, 500);
RecCircle ( 300, 250, 100, 3 ); // 3 уровня
Getch();
Дата добавления: 2015-10-05; просмотров: 790;