![]() |
![]() ![]() |
![]() |
_Артём_ |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Недавно изучил рекурсивные функции в паскале, захотел потренироваться:
uses PTCCrt,PTCGraph;
var
gd,gm:integer;
x:char;
procedure tree (a,x,y,ls,df:integer);
var x1,y1,lsr,lsv1,lsv2,ng:integer;
begin
if df <> 1 then lsr:= (ls div df) + (ls*(random(3)*2-1) div 100)
else lsr:=ls;
x1 := round(x-sin(pi/180*a)*lsr);
y1 := round(y-cos(pi/180*a)*lsr);
line(x,y,x1,y1);
if df>1 then begin
ng:=((ls-lsr)*70 div 100);
lsv1:=random(round(sqrt(abs(sqr(ls-lsr)-((ls-lsr)*30 div 100))))-ng)+ng;
lsv2:=round(sqrt(abs(sqr(ls-lsr)-sqr(lsv1))));
if random(2)=1 then begin
tree (a+round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end
else begin
tree (a-round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a+round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end;
setcolor(white);
end;
end;
begin
gd:=10;
gm:=260;
initgraph(gd,gm,'');
randomize;
x:=readkey;
while x<>'a' do begin
tree(0,1024 div 2,768,1300,13);
x:=readkey;
cleardevice;
end;
closegraph;
end.
Что можно улучшить в этой программе? Использую Free Pascal; Модули PTCGraph и PTCCrt можно заменить на Graph и Crt Пример работы: ![]() Сообщение отредактировано: _Артём_ - 6.09.2012 22:51 |
TarasBer |
![]()
Сообщение
#2
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну мне немного не нравится только этот фрагмент:
if random(2)=1 then begin
tree (a+round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end
else begin
tree (a-round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a+round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end;
У тебя обе ветки почти одинаковые, это типа не очень хорошо - копирка же. Можно чуток сократить:
if random(2)=0 then dr := 1 else dr := -1;
tree (a+dr*round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-dr*round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
Это тоже не идеал, потому что два раза вызвается tree с почти одинаковыми аргументами. Если lsv сделать массивом длины 2, то можно и это подужать. Сообщение отредактировано: TarasBer - 7.09.2012 16:23 -------------------- |
_Артём_ |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Ну мне немного не нравится только этот фрагмент:
if random(2)=1 then begin
tree (a+round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end
else begin
tree (a-round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a+round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
end;
У тебя обе ветки почти одинаковые, это типа не очень хорошо - копирка же. Можно чуток сократить:
if random(2)=0 then dr := 1 else dr := -1;
tree (a+dr*round(lsv1/(lsv1+lsv2+1)*32),x1,y1,lsv1,df-1);
tree (a-dr*round(lsv2/(lsv1+lsv2+1)*32),x1,y1,lsv2,df-1);
Это тоже не идеал, потому что два раза вызвается tree с почти одинаковыми аргументами. Если lsv сделать массивом длины 2, то можно и это подужать. Tree и должен вызываться 2 раза, а иначе как? Правда, этот фрагмент был не очень хорош. Первоначально предполагал сделать так, что-бы наибольшая из двух веток тянулась вверх, но не понял, как. |
TarasBer |
![]()
Сообщение
#4
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Tree и должен вызываться 2 раза, а иначе как? Циклом. for i := 0 to 1 do Tree(что-то там в зависимости от i) -------------------- |
_Артём_ |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
А смысл? Что-бы потом сделать большее кол-во ветвей?
|
TarasBer |
![]()
Сообщение
#6
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну смысл в том, что легче менять поведение программ, в которых меньше строк сделано под копирку.
В данном случае 2 одинаковые строки погоды не сделают, но если придираться до конца, то лучше им быть циклом. -------------------- |
_Артём_ |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Спасибо! Буду это в дальнейшем учитывать.
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 8:08 |