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 代码。