2

我目前正在学习 Java 课程,我们的教授正在让我们编写一个程序,使用递归来构建一个“Htree”,它只是一个 H,在第一个角落的每个角落都有较小的 H,并且按照用户指定的级别向下. 到目前为止,我已经递归地创建了第一个角,但我似乎无法弄清楚如何更改它,所以它将完成所有四个角。这是我的代码:

package assignment3;

public class Htree {

    public static void main(String[] args) {

        int SIZE = 512;

        // Output and entry take place in the console window

        Turtle.create(SIZE, SIZE);

        int xCenter = SIZE / 2;
        int yCenter = SIZE / 2;

        int x = 4;
        recursive(xCenter, yCenter, x);
    }

    private static void recursive(int xCenter, int yCenter, int x) {
        int x2 = x - 1;

        if (x2 < 0) {
            return;
        }
        int left = xCenter - xCenter / 2;
        int right = xCenter + xCenter / 2;
        int top = yCenter - yCenter / 2;
        int bottom = yCenter + yCenter / 2;
        int middle = yCenter;

        Turtle.fly(right, middle);
        Turtle.go(left, middle);
        Turtle.fly(right, top);
        Turtle.go(right, bottom);
        Turtle.fly(left, top);
        Turtle.go(left, bottom);
        recursive(left, top, x2);

        System.out.println("Done");
    }
}

它应该看起来像这样: 树

任何提示将不胜感激。

4

1 回答 1

3

你的代码喜欢

    int left = xCenter - xCenter / 2;
    int right = xCenter + xCenter / 2;

是有问题的。假设第二级 H 的 X 中心应位于 x=2 和 x=6。对于左手 H,您计算左 = 1,右 = 3,因此它将是 2 个单位宽。但是对于右手的 H,你计算 left=3,right=9,所以它是 6 个单位宽。结论:您的递归例程需要另一个参数来指定宽度,并且您将使用 left=xCenter-wide/2、right=xCenter+wide/2 之类的公式。

这是一种简单的方法来执行四种不同的递归调用的伪代码(用drawH(xCenter, yCenter, wide, deep)used 代替您的recursive(left, top, x2);函数):

p = q = 1
for i in {1..4}:
    drawH(xCenter+p*size/xratio, yCenter+q*size/yratio, wide/2, deep-1)
    q = p*q; p = -p; 

更正和注释,2016 年 5 月:伪代码的最后一行q = p*q; p = -p;产生 (p, q) 对 {(1, 1), (-1, 1), (1, -1), (-1, -1)}对于 H 的四个小节。

于 2013-03-21T01:00:23.533 回答