Turtle 递归错误
Error in Turtle recursion
我正在尝试使用 Turtle Graphics 通过递归制作分形,但出于某种原因,我的代码似乎无法 return Turtle 回到原点。
我的代码如下
public static void sun(Turtle t, double radius) {
for ( int i = 0; i < 360; i++ ) {
t.forward( radius * .0174 );
t.left( 1 );
}
t.penup();
t.left(90);
t.forward(radius);
//t.fill();
t.pendown();
for (int i = 0; i < 8; i++) {
t.forward(2*radius);
t.backward(2*radius);
t.left(45);
}
t.penup();
t.backward(radius);
t.right(90);
t.pendown();
}
public static void fractalSun(Turtle t, double r, int level) {
int color;
if (level == 0) {
t.color(255, 0, 0);
sun(t, r);
}
else {
sun(t, r);
t.left(90);
t.forward(r);
t.right(90);
t.forward(r * 2);
t.right(90);
fractalSun(t, r/4, level -1);
t.left(90);
t.backward(r * 2);
}
}
代码编译成功,但生成此图像:
Screenshot
我的目标是让乌龟 return 到达每个 'sun' 的中心,但有些东西不起作用。
你的 8 辐环在每个辐条后将笔留在图形的中心。在循环结束时,从中心开始,执行以下序列:
t.penup();
t.backward(radius);
t.right(90);
t.pendown();
特别是,你倒退一圈;我认为这就是你偏离预期点的地方。放下那条线,仔细检查你想要的方向,我想你会没事的。
虽然 sun()
方法 returns 海龟回到它开始的地方,但 fractalSun()
方法将海龟留在图形的中心。所以无论是fractalSun()
调用自己还是sun()
都得做调整。这是一个更改较少(主要是删除)的更新修复:
更改 sun()
中的最后一段代码:
t.penup();
t.backward(radius);
t.right(90);
t.pendown();
简单的说一句:
// t.penup();
// t.backward(radius);
t.right(90);
// t.pendown();
从 fractalSun()
中删除三行代码并将参数更改为最终函数调用:
public static void fractalSun(Turtle t, double r, int level) {
if (level == 0) {
t.color(255, 0, 0);
sun(t, r);
} else {
sun(t, r);
// t.left(90);
// t.forward(r);
// t.right(90);
t.forward(r * 2);
t.right(90);
fractalSun(t, r / 4, level - 1);
t.left(90);
t.backward(r * 2 + r / 4); // added a term to the equation
}
}
输出
注意:我使用 Python turtle 模拟了这个,所以如果它有问题,您可能需要调整我的 Java 代码。
我正在尝试使用 Turtle Graphics 通过递归制作分形,但出于某种原因,我的代码似乎无法 return Turtle 回到原点。 我的代码如下
public static void sun(Turtle t, double radius) {
for ( int i = 0; i < 360; i++ ) {
t.forward( radius * .0174 );
t.left( 1 );
}
t.penup();
t.left(90);
t.forward(radius);
//t.fill();
t.pendown();
for (int i = 0; i < 8; i++) {
t.forward(2*radius);
t.backward(2*radius);
t.left(45);
}
t.penup();
t.backward(radius);
t.right(90);
t.pendown();
}
public static void fractalSun(Turtle t, double r, int level) {
int color;
if (level == 0) {
t.color(255, 0, 0);
sun(t, r);
}
else {
sun(t, r);
t.left(90);
t.forward(r);
t.right(90);
t.forward(r * 2);
t.right(90);
fractalSun(t, r/4, level -1);
t.left(90);
t.backward(r * 2);
}
}
代码编译成功,但生成此图像: Screenshot
我的目标是让乌龟 return 到达每个 'sun' 的中心,但有些东西不起作用。
你的 8 辐环在每个辐条后将笔留在图形的中心。在循环结束时,从中心开始,执行以下序列:
t.penup();
t.backward(radius);
t.right(90);
t.pendown();
特别是,你倒退一圈;我认为这就是你偏离预期点的地方。放下那条线,仔细检查你想要的方向,我想你会没事的。
虽然 sun()
方法 returns 海龟回到它开始的地方,但 fractalSun()
方法将海龟留在图形的中心。所以无论是fractalSun()
调用自己还是sun()
都得做调整。这是一个更改较少(主要是删除)的更新修复:
更改 sun()
中的最后一段代码:
t.penup();
t.backward(radius);
t.right(90);
t.pendown();
简单的说一句:
// t.penup();
// t.backward(radius);
t.right(90);
// t.pendown();
从 fractalSun()
中删除三行代码并将参数更改为最终函数调用:
public static void fractalSun(Turtle t, double r, int level) {
if (level == 0) {
t.color(255, 0, 0);
sun(t, r);
} else {
sun(t, r);
// t.left(90);
// t.forward(r);
// t.right(90);
t.forward(r * 2);
t.right(90);
fractalSun(t, r / 4, level - 1);
t.left(90);
t.backward(r * 2 + r / 4); // added a term to the equation
}
}
输出
注意:我使用 Python turtle 模拟了这个,所以如果它有问题,您可能需要调整我的 Java 代码。