海龟递归错误

时间:2017-03-31 22:08:02

标签: recursion turtle-graphics

我尝试使用Turtle Graphics通过递归进行分形,但由于某种原因,我的代码似乎没有将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

我的目标是让乌龟回到每个太阳的中心。但有些东西不起作用。

2 个答案:

答案 0 :(得分:1)

虽然sun()方法将乌龟返回到它开始的位置,但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
    }
}

<强>输出

enter image description here

注意:我使用Python龟模拟了这个,所以你可能需要调整我的Java代码,如果它不对。

答案 1 :(得分:-1)

每次说话后,你的8辐环都会将笔留在图形的中心。在循环结束时,从中心开始,执行以下序列:

t.penup();
t.backward(radius);
t.right(90);
t.pendown();

特别是,你支持一个半径;我认为那是你摆脱目标的地方。放下那条线,仔细检查你想要的方向,我想你会没事的。