Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 海龟递归中的错误_Recursion_Turtle Graphics - Fatal编程技术网

Recursion 海龟递归中的错误

Recursion 海龟递归中的错误,recursion,turtle-graphics,Recursion,Turtle Graphics,我试图使用海龟图形通过递归生成分形,但由于某些原因,我的代码似乎无法将海龟返回原点。 我的代码如下 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

我试图使用海龟图形通过递归生成分形,但由于某些原因,我的代码似乎无法将海龟返回原点。 我的代码如下

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);
 }
}
public static void sun(海龟t,双半径){
对于(int i=0;i<360;i++){
t、 向前(半径*.0174);
t、 左(1);
}
t、 penup();
t、 左(90);
t、 前进(半径);
//t、 填充();
t、 彭敦();
对于(int i=0;i<8;i++){
t、 向前(2*半径);
t、 向后(2*半径);
t、 左(45);
}
t、 penup();
t、 向后(半径);
t、 右(90);
t、 彭敦();
}
公共静态空隙分形(t形,双r形,整数级){
内色;
如果(级别==0){
t、 颜色(255,0,0);
太阳(t,r);
}
否则{
太阳(t,r);
t、 左(90);
t、 前进(r);
t、 右(90);
t、 远期(r*2);
t、 右(90);
分形(t,r/4,1级);
t、 左(90);
t、 向后(r*2);
}
}
代码编译成功,但生成以下图像:


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

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

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

特别是,您备份一个半径;我想这就是你偏离目标的地方。放下那条线,仔细检查你想要的方向,我想你会没事的。

你的8辐环在每一个辐后都会把笔留在图形的中心。在循环结束时,从中心开始,执行以下顺序:

t.penup();
t.backward(radius);
t.right(90);
t.pendown();
特别是,您备份一个半径;我想这就是你偏离目标的地方。放下那条线,仔细检查你想要的方向,我想你会没事的。

虽然
sun()
方法将海龟返回到它开始的位置,但是
fractalSun()
方法将海龟留在图形的中心。所以无论
fractalSun()
调用自身还是
sun())
它必须进行调整。以下是一个更新修复程序,更改较少(主要是删除):

sun()
中更改最后一块代码:

简单地说:

// 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代码有问题,您可能需要调整它。

尽管
sun()
方法将turtle返回到它开始的位置,但是
fractalSun()
方法将turtle保留在图形的中心。因此无论
fractalSun()
调用自身还是
sun())
它必须进行调整。以下是一个更新修复程序,更改较少(主要是删除):

sun()
中更改最后一块代码:

简单地说:

// 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代码有问题,您可能需要调整它。

啊,好的!谢谢大家!@willizen,我已经更新了这个答案,使它更接近你原来的设计,删除了大部分线条,修改了一个计算。啊,好的!谢谢大家!@willizen,我已经更新了这个答案,使之更接近您的原始设计,删除了大部分线条,修改了一个计算。@willizen,我无法按描述完成这项工作,可以吗?此更改保留了返回中心时出现的原始问题,需要修改其他子例程。我相信问题不仅仅在于方向,也就是说,在回程计算中缺少了一个
r/4
距离单位。@willizen,我不能按描述的那样工作,你能吗?此更改保留了返回中心时出现的原始问题,需要修改其他子例程。我相信问题不仅仅在于方向,也就是说,回程计算中缺少了一个
r/4
距离单位。