4

私はJavaでコーディングすることを学んでおり、Javaプログラミングの再帰部分に到達しました。私は再帰的方法の基本を理解しており、空間充填ヒルベルト曲線 (および Levy C 曲線) をコーディングしようとしていますが、これまでのところ、実際の再帰部分まではすべて順調に進んでいます。再帰的な方法を考え出すのに苦労しています。誰かが私を助けてくれるかどうか知りたいです。また、DrawHilbert メソッドに含める必要があることもわかっています。

public class HilbertCurve extends JPanel {
int N;

/**
 * Constructor for Hilbert Curve
 */
public HilbertCurve () 
{
    Scanner myKeyboard = new Scanner(System.in);
    System.out.println("Enter an integer number to indicate the level of recursive depth: ");
    N = myKeyboard.nextInt();
    // Create a JFrame - a window that will appear on your screen
    JFrame f = new JFrame();

    // Tells the program to quit if you close the window
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Puts your drawing into the window (the JFrame)
    f.add(new JScrollPane(this));
    // Changes the size of the window on the screen
    f.setSize(600, 600);
    // Changes where the window will appear on your screen
    f.setLocation(200, 200);
    // Makes the window appear
    f.setVisible(true);
}
public void setupHilbert (Turtle turtle) 
{
    turtle.penup();
    turtle.setXY(0,0);

    // draw a simple rectangle that is 100x50 pixels
    turtle.pendown();

    drawHilbert(turtle, N); 
}

public void drawHilbert(Turtle turtle, int n) {

    if (n == 0) return;
    turtle.changeColor(Color.GREEN);
    turtle.changeWidth(2);
    turtle.left(-90);
    turtle.forward(100);
    turtle.left(90);
    turtle.forward(100);
    turtle.left(90);
    turtle.forward(100);
    turtle.left(-90);
    turtle.penup();
}

protected void paintComponent(Graphics g)
{
    Turtle turtle = new Turtle((Graphics2D) g, getBounds());

    turtle.setHeadingMode(Turtle.DEGREE);
    setupHilbert(turtle);

}


// plot a Hilbert curve of order N
public static void main(String[] args) 
{
    Scanner myKeyboard = new Scanner(System.in);
    HilbertCurve test = new HilbertCurve();
}

}

4

1 に答える 1

1

再帰の明らかな兆候は、自分自身を呼び出す関数です。どこかで自分自身の内部への呼び出しが見られることを期待してdrawHilbert()いますが、そうではありません。

停止条件に細心の注意を払うか、再帰呼び出しがスタックに永久に追加されるため、OutOfMemoryError が発生します。

私はあなたの問題に精通していませんが、これはあなたが見逃しているものでしょうか?

public void drawHilbert(Turtle turtle, int n) {

    if (n == 0) return;
    turtle.changeColor(Color.GREEN);
    turtle.changeWidth(2);
    turtle.left(-90);
    turtle.forward(100);
    turtle.left(90);
    turtle.forward(100);
    turtle.left(90);
    turtle.forward(100);
    turtle.left(-90);
    turtle.penup();
    drawHilbert(turtle, --n);  // is this where your recursion should go?
}

更新: このサイトは適切に見えます。

http://people.cs.aau.dk/~normark/prog3-03/html/notes/fu-intr-2_themes-hilbert-sec.html

于 2012-05-04T12:30:36.967 に答える