2

私は現在Javaのクラスを受講しており、教授は再帰を使用して「Htree」を作成するプログラムを作成してもらいます。これは、最初の隅に小さなHがあり、ユーザーが指定したレベルだけ下がったHツリーです。 。これまでのところ、FIRSTコーナーを再帰的に作成していますが、4つのコーナーすべてを実行するように変更する方法がわからないようです。これが私のコードです:

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");
    }
}

そして、それは次のように見えるはずです: Htree

ヒントをいただければ幸いです。

4

1 に答える 1

3

あなたのコードは

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

問題があります。第2レベルのHのX中心がx=2およびx=6にあると仮定します。左側のHの場合、left = 1、right = 3を計算するため、幅は2単位になります。ただし、右側のHの場合、left = 3、right = 9を計算するため、幅は6単位になります。結論:再帰ルーチンには、幅を指定するための別のパラメーターが必要であり、left = xCenter-wide / 2、right = xCenter + wide/2のような式を使用します。

これは、4つの異なる再帰呼び出し(関数drawH(xCenter, yCenter, wide, deep)の代わりに使用)を実行する簡単な方法の擬似コードです。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の4本のバー用。

于 2013-03-21T01:00:23.533 に答える