У меня чего то не выходит делать рекурсивно. Хоть паручку программ делал рекурсивно факториала, фибоначи и деление
div без div кажится перевод чисел с десятичной в двоичную систему. Вот последние что недавно сделал сам
uses graph,crt;
var grDriver, grMode, errCode: integer;
procedure kryg(x,y,r:integer);
begin
circle(x,y,r);
// readln;
if r>10 then kryg(x-r,y,r div 2);
if r>10 then kryg(x+r,y,r div 2);
if r>10 then kryg(x,y-r,r div 2);
if r>10 then kryg(x,y+r,r div 2);
end;
begin
grDriver:=detect;
InitGraph(grDriver,grMode,'');
errCode:=GraphResult;
if errCode=grOk then
begin
kryg(getmaxx div 2,getmaxy div 2,100);
writeln('k');
end;
readln;
closegraph;
end.
А что именно с квадратами не получается? Программа виснет?
В рекурсии главное - условие выхода.
Вот твой пример, который ты сюда вписал, рабочий. В нём есть условие выхода - если r<=10 (оно тут явно не записано, но понятно, что при r<=10 рекурсия останавливается).
Вот и квадраты - тоже с условием выхода делай.
Про условия выхода мне понятно вот что я сделал и неправильно
program kvadrat;
uses graph,crt;
var grDriver, grMode, errCode,r: integer;
procedure kv(x,y,x1,y1,lvl:integer);
var x2,y2:integer;
begin
if lvl<>1 then
begin
rectangle(x,y,x1,y1);
x2:=x1 div 3;
y2:=y1 div 3;
kv(x,y,x2,y2,lvl-1);
kv(x2,y,x2+x2,y2,lvl-1);
kv(x2,y2+y2,x2+x2+x2,y2,lvl-1);
kv(x,y2,x2,y2+y2,lvl-1);
kv(x,y2+y2,x2,y2+y2+y2,lvl-1);
kv(x2,y2,x2+x2,y2+y2,lvl-1);
kv(x2+x2,y2,x2+x2+x2,y2+y2,lvl-1);
kv(x2,y2+y2,x2+x2,y2+y2+y2,lvl-1);
kv(x2+x2,y2+y2,x2+x2+x2,y2+y2+y2,lvl-1);
{ kv(x,y,x2,y2,lvl-1);
kv(x,y,x2+x2,y2,lvl-1);
kv(x,y,x2+x2+x2,y2,lvl-1);
kv(x,y,x2,y2+y2,lvl-1);
kv(x,y,x2,y2+y2+y2,lvl-1);
kv(x,y,x2+x2,y2+y2,lvl-1);
kv(x,y,x2+x2+x2,y2+y2,lvl-1);
kv(x,y,x2+x2,y2+y2+y2,lvl-1);
kv(x,y,x2+x2+x2,y2+y2+y2,lvl-1); }
end
end;
begin
grDriver:=detect;
InitGraph(grDriver,grMode,'');
errCode:=GraphResult;
if errCode=grOk then
begin
kv(0,0,getmaxx,getmaxy,3);
end;
readln;
closegraph;
end.
С рекурсией тут всё в порядке.
Координаты внутри ошибочно написаны.
Например,
kv(x2,y2+y2,x2+x2+x2,y2,lvl-1);
Китайский код до добра не доводит. В смысле не надо через копировать-вставить делать непонятное месиво, в котором сам путаешься.
Напиши так:
x2 := (x1-x) div 3;
y2 := (y1-y) div 3;
for i := 0 to 2 do for j := 0 to 2 do
if (i <> 1) or (j <> 1) then // центральный квадрат не трогаем.
kv(x+x2*i,y+y2*i,x+x2*(i+1),y+y2*(i+1),lvl-1);
скопировал вставил вместо китайского кода неправильно вставил наверное код и нечего непонятно
program kvadrat;
uses graph,crt;
var grDriver, grMode, errCode,r: integer;
procedure kv(x,y,x1,y1,lvl:integer);
var x2,y2,i,j:integer;
begin
if lvl<>1 then
begin
rectangle(x,y,x1,y1);
x2 := (x1-x) div 3;
y2 := (y1-y) div 3;
for i := 0 to 2 do for j := 0 to 2 do
if (i <> 1) or (j <> 1) then // центральный квадрат не трогаем.
kv(x+x2*i,y+y2*i,x+x2*(i+1),y+y2*(i+1),lvl-1);
end
end;
begin
grDriver:=detect;
InitGraph(grDriver,grMode,'');
errCode:=GraphResult;
if errCode=grOk then
begin
kv(0,0,getmaxx,getmaxy,4);
end;
readln;
closegraph;
end.
Ну квадратики внутри большого расположены в виде таблицы 3 на 3, значит, чтобы их перебрать, надо построить внешний цикл так:
for i := 0 to 2 do for j := 0 to 2 do
Паре (1,1) соответствует центральный квадрат, её трогать не надо.
Теперь надо координаты маленьких квадратиков вычислить так, чтобы они при i=0 были равны x и при увеличении i менялись на x2 (x2 - это треть стороны большого квадрата).
kv(x+x2*i,y+y2*i,x+x2*(i+1),y+y2*(i+1),lvl-1);
И аналогично для y и j.
То есть в выражениях для параметров, у которых не x, а y, надо заменить i на j:
kv(x+x2*i,y+y2*j,x+x2*(i+1),y+y2*(j+1),lvl-1);
Я думал, сам догадаешься.
> неправильно вставил наверное код
В каком смысле?
Не компилируется?
Запускается и зависает?
Запускается и вылетает?
Рисует не ту картинку?
Нормально говори о неполадках.
А то будет как в той истории с выключенным светом.
неправильно вставил наверное код
ну я это только что 3 квадрата только идут в большом квадрате
Скриншот покажи.
После замены i на j - тоже?
> После замены i на j - тоже?
Заменять только те, что при игреке.
заменил в y i на j и при kv(0,0,getmaxx,getmaxy,3); все нормально а при kv(0,0,getmaxx,getmaxy,4); вот так
Ну и? Так надо.
Вызови kv(0,0,getmaxx,getmaxy,8), будет совсем красиво.
Или тебе центральный квадрат таки нужен? Тогда убери условие <> 1
Просто ты не говоришь, что именно тебе надо, вот и додымываю на ходу.
я все ровно что то недопонимаю о рекурсиях
Добавлено через 3 мин.
Убрал условия <>0 ага при 8 красиво рисует и правильно как надо но я все ровно не понимаю рекурсии
Добавлено через 11 мин.
я вот сперва не знал что надо заменить i на j что потом убрать условия <> 1
и я как бы нехотел чтобы мне решили задачу а только обьяснили бы или дали полегче задачи на рукурсию
Добавлено через 19 мин.
Может дадите какие то задания или что чтобы разобраться с рекурсией
ну вот так и нечего не разобрался я в этих фракталах и рекурсиях мне надо сейчас как то сделать в треугольники перевернутый треугольник и так далее но не как не знаю как сделать вот в интернете нашел программку где треугольники рисуются
Uses Crt,Graph;
Var x1,y1,x2,y2,x3,y3, grDriver, grMode, errCode: integer;
PROCEDURE tr(x1,y1,x2,y2,x3,y3, lvl: integer);
Var x12,y12,x23,y23,x31,y31: integer;
Begin If lvl<>0 then begin
x12:=(x1+x2) div 2; y12:=(y1+y2) div 2;
x23:=(x2+x3) div 2; y23:=(y2+y3) div 2;
x31:=(x3+x1) div 2; y31:=(y3+y1) div 2;
line(x31,y31,x12,y12);
line(x12,y12,x23,y23);
line(x23,y23,x31,y31);
tr(x1,y1,x12,y12,x31,y31, lvl-1);
tr(x2,y2,x12,y12,x23,y23, lvl-1);
tr(x3,y3,x31,y31,x23,y23, lvl-1);
end;
end;
Begin
grDriver:=detect;
InitGraph(grDriver,grMode,'');
errCode:=GraphResult;
if errCode=grOk then
begin
x1:=853; y1:=370; x2:=639; y2:=getmaxy; x3:=426; y3:=370;
Line(x1,y1,x2,y2);
Line(x2,y2,x3,y3);
Line(x3,y3,x1,y1);
tr(x1,y1,x2,y2,x3,y3, 3);
end;
readln;
CloseGraph;
end.
Ты лучше у сверстников попроси объяснить.
Я умею что-то объяснять только с картинками и показывая руками, голым текстом нихрена не выйдет.
мои сверстники до этого не дошли еще до этого