Смысл построить дерево используя метод восходящей рекурсии.
Ниже представлен код рисующий обычное дерево:
#include <graphics.h>
#include <iostream.h>
#include <conio.h>
#include <MATH.H>
#include <dos.H>
int driver=DETECT, mode;
const double X=300, Y=450, L=90, A=-M_PI/2 ;
void tree(double x, double y, double L, double a, int k)
{ if (k>0)
{ if (L>40)
setcolor(6);
else
setcolor(10);
if (L<30)
setlinestyle(0,1,1);
else
setlinestyle(0,1,3);
line(x,y,x+L*cos(a),y+L*sin(a));
tree(x+L*cos(a),y+L*sin(a),L*0.8,a-M_PI/8,k-1);
tree(x+L*cos(a),y+L*sin(a),L*0.8,a+M_PI/8,k-1);
}
}
void main()
{ initgraph(&driver,&mode,"g:\\BorlandC\\bgi");
int level=1;
int cod=0;
do
{ setcolor(0);
cleardevice();
tree(X,Y,L,A,level);
cod=getch();
if (!cod)
cod=getch();
if ((cod==75)&&(level<14))
level++;
else if ((cod==77)&&(level>1))
level--;
cleardevice();
}
while (cod!=27);
closegraph();
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Помогите построить точно такое дерево, но используя метод восходящей рекурсии. При этом в программе должен быть все один цикл FOR, зависящий от изменяющихся угла наклока и длины каждой ветки.
Вот что пробовал сделать Я, но препод сказал что это неверно.
#include <graphics.h>
#include <conio.h>
#include <math.h>
int driver=DETECT, mode;
int level=1;
const double X=300, Y=450, L=90, A=-M_PI/2;
long double x,y,l,a;
char *sfg;
int k=0;
/*процедура one(x,y,l,a) рисует линию длины l под углом a к вертикали из точки с коор-ми (x,y) (в зависимости от длины линии задается ее цвет и толщина (ifы))*/
void one(double x, double y, double l, double a)
{ if (l>40)
setcolor(6);
else
setcolor(10);
if (l<30)
setlinestyle(0,1,1);
else
setlinestyle(0,1,3);
line(x,y,x+l*cos(a),y+l*sin(a));
}
/*процедура CHoiCE(nn) рассчитывает параметры для линии типа nn, причем
0- вниз и влево
1- вверх по той же ветке что и 0
2- вниз и вправо
3- вверх по той же ветке что и 2
*/
void CHoiCE(int nn)
{ switch (nn)
{ case 0: {x=x+l*cos(a);
y=y+l*sin(a);
a=a-M_PI/8;
l=l*0.8;
break;};
case 1: {one(x, y, l, a);
a=a+M_PI/8;
l=l/0.8;
x=x-l*cos(a);
y=y-l*sin(a);
break;};
case 2: {x=x+l*cos(a);
y=y+l*sin(a);
a=a+M_PI/8;
l=l*0.8;
break;};
case 3: {one(x, y, l, a);
a=a-M_PI/8;
l=l/0.8;
x=x-l*cos(a);
y=y-l*sin(a);
break;};
};
}
void tree()
{ x=X;y=Y;a=A;l=L;
int sch=0,hl=0;
for(int j=0;j<level-2;CHoiCE(0),j++);
do
{ for(int i=0;i<=3;CHoiCE(i),i++);
sch++;
if (sch%2)
{CHoiCE(1);
CHoiCE(2);}
else
{if (!(sch%4))
{if (sch<=pow(2,level-3))
hl=sfg[sch/4-1];
else if (sch>pow(2,level-3))
hl=sfg[(sch-pow(2,level-3))/4-1];
}
else hl=1;
for(i=0;i<hl;CHoiCE(3),i++);
CHoiCE(1);
CHoiCE(2);
for(i=0;i<hl;CHoiCE(0),i++);
};
}
while (sch!=pow(2,level-2));
}
void main()
{ initgraph(&driver,&mode,"g:\\BorlandC\\bgi");
int cod=0;
sfg=new char[200];
sfg[0]=2; k=1;
do
{ cleardevice();
if (level>1)
tree();
one(X,Y,L,A);
cod=getch();
if (!cod)
cod=getch();
if ((cod==75)&&(level<14))
{ level++;
if (level>5)
{ sfg[k]=level-3;
for(int i=0;i<k;i++ )
{ sfg[2*k-i]=sfg;}
k=2*k+1;
}
}
else if ((cod==77)&&(level>1))
{ if (level>5)
k=k/2;
level--;
}
cleardevice();
}
while (cod!=27);
delete []sfg;
closegraph();
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\