嵌套右等腰三角形Java

时间:2014-10-19 22:59:02

标签: java recursion

我在使用我的代码时遇到了一些麻烦。在我的代码中,嵌套的右等腰三角形被假设为这样绘制:enter image description here
我不确定我的代码是否会起作用,因为一旦我运行它,就不会绘制三角形。我收到了这个错误

  

线程中的异常" AWT-EventQueue-0" java.lang.StackOverflowError的

我不确定如何修复它。救命?

import java.awt.*;
import javax.swing.*;

public class Ornament extends JPanel
{
 public void paintComponent( Graphics g )
 {
    super.paintComponent( g ); // Call JPanel's paintComponent method
                               // to paint the background
    drawTriangles( g, 100, 80, 64 );
 }


/**
 * Draws an ornament made of triangles in Graphics g with the base midpoint
 * at (x, y) and base half-length r
 */
 public void drawTriangles( Graphics g, int x, int y, int r )
 {
    g.drawLine( x + r, y, x - r, y ); 
    g.drawLine( x + r, y, x, y - r );
    g.drawLine( x - r, y, x, y - r );

    if ( r == 4 )
    {
        drawTriangles( g, x-r , y, r );
        drawTriangles( g, x-r , y, r );
    }

    else {

        drawTriangles( g, 36+r , y, r );
        r --;
    }

 }


public static void main( String[] args )
 {
    JFrame w = new JFrame( "Triangles" );
    w.setBounds( 300, 300, 200, 120 );
    w.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    Ornament panel = new Ornament();
    panel.setBackground( Color.WHITE );
    Container c = w.getContentPane();
    c.add( panel );
    w.setResizable( false );
    w.setVisible( true );
 }
}

3 个答案:

答案 0 :(得分:1)

如果您致drawTriangles r不等于4,则会使用相同的r一次又一次地呼叫自己。永远不会达到r--

尝试在else子句中的递归调用之前放置r--

答案 1 :(得分:1)

一旦达到4(您的基本情况),您就不想继续,因此您可以将if声明写为

if (r != 4) {
    drawTriangles(g, 36 + r , y, r - 1);
}

这不会产生原始描述中所示的图形输出,但会阻止SOE

答案 2 :(得分:0)

您正在创建无限循环。 这是第一系列迭代中发生的事情:

drawTriangles( g, 100, 80, 64 );
  // draw lines
  drawTriangles( g, 136 , 80, 64 );
    // draw lines
    drawTriangles( g, 172 , 80, 64 );
      // draw lines
      drawTriangles(g, 208, 80, 64);
      r--;
    r --;
  r--;

等等。 但是r--永远不会到达,因为你先进入下一级递归。 如果你交换drawTriangles和r--,至少r会变小,虽然不是很快。我本来期待r / 2或那里的东西。