IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Расскажите про рекурсию, запутался я с ней
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


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

Сообщение отредактировано: maksimla -


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


А что именно с квадратами не получается? Программа виснет?

В рекурсии главное - условие выхода.
Вот твой пример, который ты сюда вписал, рабочий. В нём есть условие выхода - если r<=10 (оно тут явно не записано, но понятно, что при r<=10 рекурсия останавливается).
Вот и квадраты - тоже с условием выхода делай.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


Про условия выхода мне понятно вот что я сделал и неправильно
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 или больще
вот чтото непонятно с рукусией


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


С рекурсией тут всё в порядке.
Координаты внутри ошибочно написаны.

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



Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  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.


Сообщение отредактировано: maksimla -


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

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


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

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

Нормально говори о неполадках.
А то будет как в той истории с выключенным светом.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


неправильно вставил наверное код
ну я это только что 3 квадрата только идут в большом квадрате


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Скриншот покажи.
После замены i на j - тоже?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


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


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> После замены i на j - тоже?

Заменять только те, что при игреке.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


заменил в y i на j и при kv(0,0,getmaxx,getmaxy,3); все нормально а при kv(0,0,getmaxx,getmaxy,4); вот так
Прикрепленное изображение


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ну и? Так надо.
Вызови kv(0,0,getmaxx,getmaxy,8), будет совсем красиво.
Или тебе центральный квадрат таки нужен? Тогда убери условие <> 1
Просто ты не говоришь, что именно тебе надо, вот и додымываю на ходу.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


я все ровно что то недопонимаю о рекурсиях

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

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

Добавлено через 19 мин.
Может дадите какие то задания или что чтобы разобраться с рекурсией


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


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

а мне еще надо тут доделать чтобы в треугольниках рисовались перевернутые треугольники
может как то объясните что примерно надо делать?
А то опять код выложите и я опять не пойму как рекурсивно делать хоть в коде нечего сложного не будит


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ты лучше у сверстников попроси объяснить.
Я умею что-то объяснять только с картинками и показывая руками, голым текстом нихрена не выйдет.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


мои сверстники до этого не дошли еще до этого


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.04.2024 21:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name