2012-05-04 10 views
4

私はJavaでコード化することを学んでおり、Javaプログラミングの再帰部分を得ました。私は再帰的な方法に入ることの基礎を理解しており、ヒルベルト曲線(およびレビーC曲線)を埋め込む空間をコーディングしようとしており、実際の再帰部分まですべてがスムーズに航行しています。私は再帰的な方法を考え出すのに問題があり、誰かが私を助けてくれるかどうかを知りたいと思っています。また、私はそれがDrawHilbertメソッドにある必要があることを知っています。空き領域の再帰アルゴリズムJavaのヒルベルト曲線

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

}

+0

おかしい事は反復アルゴリズムは、ヒルベルト曲線を描画するためにもはるかに難しいことではありませんがあることである再帰的な方法:https://marcin-chwedczuk.github.io/iterative-algorithm-for-drawing-hilbert -curve – csharpfolk

答えて

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

+0

さて、それは本当です。呼び出し自体は、再帰関数の3つのコンポーネントの1つです。だから私はこれを追加: if(n == 0)return; \t \t turtle.changeColor(Color.BLUE); \t \t turtle.changeWidth(2); \t \t turtle.left(-90); \t \t drawHilbert(カメ、N-1); \t \t turtle.forward(100); \t \t turtle.left(90); \t \t drawHilbert(カメ、N-1); \t \t turtle.forward(100); \t \t turtle.left(90); \t \t drawHilbert(カメ、N-1); \t \t turtle.forward(100); \t \t turtle.left(-90); \t \t turtle.penup(); ' しかし、それは動作していないようです。私は近くにいる – Christopher

+0

私は知らない - あなたの問題をよりよく理解しなければならないだろう。あなたが渡すパラメータnから引き算する必要があるので、N-1は私には見えません。Javaの大文字と小文字が区別されるので、 "n"と "N"は異なる変数名です。 – duffymo

+0

謝罪しないでください。あなたは学んでおり、精力的に努力しています。私が投稿したリンクを見てください。私は、再帰がどこに収まるかを綴ると思います。 – duffymo

関連する問題