Помощь - Поиск - Пользователи - Календарь
Полная версия: Расскажите про рекурсию
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
maksimla
У меня чего то не выходит делать рекурсивно. Хоть паручку программ делал рекурсивно факториала, фибоначи и деление
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.



А другие чего то не получаются такие как кривая коха нашол в интернете пример ее на паскале понел кажится а другие немогу сделать.
Можете дать какие то легкие задания лутше без графики
У меня сейчас задание такое Один большой квадрат а в нем 9 маленьких квадратов нарисовать и так далее в тех еще квадраты. Вот как бы знаю как делать но чего то не получается. Хоть опять можно в интернете найти решение а я эту программку хочу сам решить. но что то не понимаю в рекурсиях
TarasBer
А что именно с квадратами не получается? Программа виснет?

В рекурсии главное - условие выхода.
Вот твой пример, который ты сюда вписал, рабочий. В нём есть условие выхода - если r<=10 (оно тут явно не записано, но понятно, что при r<=10 рекурсия останавливается).
Вот и квадраты - тоже с условием выхода делай.
maksimla
Про условия выхода мне понятно вот что я сделал и неправильно
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(0,0,getmaxx,getmaxy,3); вместо 3 поставить 4 или больще
вот чтото непонятно с рукусией
TarasBer
С рекурсией тут всё в порядке.
Координаты внутри ошибочно написаны.

Например,
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);

maksimla
скопировал вставил вместо китайского кода неправильно вставил наверное код и нечего непонятно
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.
TarasBer
Ну квадратики внутри большого расположены в виде таблицы 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);

Я думал, сам догадаешься.


> неправильно вставил наверное код

В каком смысле?
Не компилируется?
Запускается и зависает?
Запускается и вылетает?
Рисует не ту картинку?

Нормально говори о неполадках.
А то будет как в той истории с выключенным светом.
maksimla
неправильно вставил наверное код
ну я это только что 3 квадрата только идут в большом квадрате
TarasBer
Скриншот покажи.
После замены i на j - тоже?
TarasBer
> После замены i на j - тоже?

Заменять только те, что при игреке.
maksimla
заменил в y i на j и при kv(0,0,getmaxx,getmaxy,3); все нормально а при kv(0,0,getmaxx,getmaxy,4); вот так
Нажмите для просмотра прикрепленного файла
TarasBer
Ну и? Так надо.
Вызови kv(0,0,getmaxx,getmaxy,8), будет совсем красиво.
Или тебе центральный квадрат таки нужен? Тогда убери условие <> 1
Просто ты не говоришь, что именно тебе надо, вот и додымываю на ходу.
maksimla
я все ровно что то недопонимаю о рекурсиях

Добавлено через 3 мин.
Убрал условия <>0 ага при 8 красиво рисует и правильно как надо но я все ровно не понимаю рекурсии

Добавлено через 11 мин.
!bye2.gif я вот сперва не знал что надо заменить i на j что потом убрать условия <> 1
и я как бы нехотел чтобы мне решили задачу а только обьяснили бы или дали полегче задачи на рукурсию

Добавлено через 19 мин.
Может дадите какие то задания или что чтобы разобраться с рекурсией
maksimla
ну вот так и нечего не разобрался я в этих фракталах и рекурсиях мне надо сейчас как то сделать в треугольники перевернутый треугольник и так далее но не как не знаю как сделать вот в интернете нашел программку где треугольники рисуются
 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.

а мне еще надо тут доделать чтобы в треугольниках рисовались перевернутые треугольники
может как то объясните что примерно надо делать?
А то опять код выложите и я опять не пойму как рекурсивно делать хоть в коде нечего сложного не будит
TarasBer
Ты лучше у сверстников попроси объяснить.
Я умею что-то объяснять только с картинками и показывая руками, голым текстом нихрена не выйдет.
maksimla
мои сверстники до этого не дошли еще до этого
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.