Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ рекурсия вроде бы

Автор: Sensitive 9.06.2007 4:43

Подскажите такое задание решается с помощью рекурсии или как-то по-другому?
(Построить окружность вокруг которой расположено 8 окружностей меньшего радиуса,и вокруг каждой из этих окружностей расположено еще по 8 окружностей также меньшего радиуса и т.д.)

Автор: Lapp 9.06.2007 5:01

Цитата(Sensitive @ 9.06.2007 1:43) *

решается с помощью рекурсии или как-то по-другому?
Конечно, рекурсия. То есть можно и по-другому - но зачем? Только определись с моментом остановки, иначе она "уйдет в себя".. smile.gif

Вот, примерно так:
procedure Circles(x,y,r:integer);
begin
if r>0 then begin
Circle(x,y,r);
for i:=1 to 8 do Circles({тут вычисленные значения центров и рудиусов})
end
end;

Автор: volvo 9.06.2007 5:04

Да, это именно рекурсия...

Здесь глянь: http://forum.sources.ru/index.php?showtopic=157133&view=findpost&p=1295438

Автор: Sensitive 9.06.2007 16:51

Спасибо Вам, я сделала программу!

Автор: klem4 11.06.2007 20:37

Показала бы чтоли что получилось smile.gif

Прикрепленное изображение

У меня вот так вышло (идея судя по всему такая-же как предлагал Lapp):

uses crt, graph;

function _x (const angle: Integer; const cx, len: integer): Integer;
begin _x := round(cx + len * cos(45*angle / 180 * pi)); end;

function _y (const angle: Integer; const cy, len: integer): Integer;
begin _y := round(cy - len * sin(45*angle / 180 * pi)); end;

procedure Circles(cx, cy, radius, deep: Integer);
var
angle: Integer;
begin
if deep > 0 then begin
dec(deep);
for angle := 0 to 7 do begin
Circle (_x(angle, cx, radius * 2), _y(angle, cy, radius * 2), radius div 3);
Circles (_x(angle, cx, radius * 2), _y(angle, cy, radius * 2), radius div 4, deep);
end;
end;
end;

var
gd, gm: Integer;

begin
gd := detect;
initgraph(gd, gm, '');

Circle(GetMaxX div 2, GetMaxY div 2, 120);
Circles(GetMaxX div 2, GetMaxY div 2, 120, 3);

readkey;
closegraph;
end.

Автор: Sensitive 11.06.2007 22:01

Вот,что получилось (делала так, как показано по ссылке volvo)

uses crt,graph;
var x,y,r,n:integer;
Procedure circles(x,y,pr,r,n:integer);
var i:integer;
newX,newY:integer;
const angle=pi/4;
begin
setcolor(lightgreen);
circle(x,y,pr);
if n>1 then
for i:=1 to 8 do begin
circles(x+trunc(r*sin(i*angle)),y-trunc(r*cos(i*angle)),pr div 4,r div 3,n-1);
end;
end;
begin
writeln('Vvedite glubinu rekursii-');
readln(n);
init;
circles(getmaxx div 2,getmaxy div 2,40,160,n);
readkey;
closegraph;
end.