首页 > 解决方案 > 无法通过谢尔平基三角形的递归

问题描述

我只需要让这段代码工作。我知道它的形式不好或效率不高,但我只需要它递归地绘制谢尔宾斯基三角形。它到达第一个递归调用,但永远不会超过它,只绘制三角形的一部分。我知道我很愚蠢,答案很明显,但我很久没有编码了。感谢您的任何帮助!

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

public class recursiveTriangle18 extends JApplet
{
   private final int APPLET_WIDTH = 800;
   private final int APPLET_HEIGHT = 800;

/*
   //x is accross and y is down
   point 1 - Right  A x[0],y[0] (720,600)
   point 2 - Left   B x[1],y[1]
   point 3 - Top    C x[2],y[2]
   point 4 draws back to point 1 to complete triangle

*/  private int[] xPos = {720, 80, 400, 720};
    private int[] yPos = {600, 600, 40, 600};

   //-----------------------------------------------------------------
   //  Sets up the basic applet environment.
   //-----------------------------------------------------------------
   public void init()
   {
      setBackground (Color.white);
      setSize (APPLET_WIDTH, APPLET_HEIGHT);
   }

   //-----------------------------------------------------------------
   //  Draws a rocket using polygons and polylines.
   //-----------------------------------------------------------------
   public void paint (Graphics page)
   {

        page.setColor (Color.BLUE);
        page.drawPolyline (xPos, yPos, xPos.length);

        Triangle(xPos,yPos, 0, page);

   }//end of paint

   public void Triangle(int[] xPos, int[] yPos, int flag, Graphics page)
   {
       //Find the distance between 2 points ex. - x,y & x1,y1
       int x = xPos[0];
       int x1 = xPos[1];
       int x2 = xPos[2];
       int x3 = xPos[3];
       int y = yPos[0];
       int y1 = yPos[1];
       int y2 = yPos[2];
       int y3 = yPos[3];

       double dist = Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));
       //find the mid points of each line segment
       while (dist >= 100){
            int midpointx = ((x+x1)/2);
            int midpointy = ((y+y1)/2);
            int midpointx1 = ((x1+x2)/2);
            int midpointy1 = ((y1+y2)/2);
            int midpointx2 = ((x2+x3)/2);
            int midpointy2 = ((y2+y3)/2);


            //make the x and y array (3 points + first point to finish triangle)

            //create x,y Array using the midpoints you calculated

            int [] xpoints = {midpointx2, midpointx, midpointx2};
            int [] ypoints = {midpointy2,y, midpointy, midpointy2};


            int [] xpoints1 = {midpointx, midpointx1, x1, midpointx};
            int [] ypoints1 = {midpointy, midpointy1, y1, midpointy};

            int [] xpoints2 = {midpointx1, midpointx2,x2,midpointx1};
            int [] ypoints2 = {midpointy1, midpointy2,y2,midpointy1};


            page.drawPolyline(xpoints1, ypoints1, xpoints1.length);
            page.drawPolyline(xpoints2, ypoints2, xpoints2.length);
            page.drawPolyline(xpoints, ypoints, xpoints.length);

           //if the segment/distance is 300 or so, good length to stop

           // Recursive calls for each section of triangle 
                Triangle(xpoints, ypoints, flag, page); 

                Triangle(xpoints2, ypoints2, flag, page); // how to get here?

                Triangle(xpoints1, ypoints1, flag, page);
            }

            }


    //end of Triangle
}

标签: javarecursion

解决方案


Triangle(xpoints, ypoints, flag, page); 

Triangle(xpoints2, ypoints2, flag, page); // how to get here?

每个Triangle调用都在对 进行另一个调用Triangle,因此这是一个永远不会返回的无限递归。您需要if (stop condition)在递归调用周围设置一个块来告诉它何时停止递归。

还有一个问题:

double dist = Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));
//find the mid points of each line segment
while (dist >= 100){

你永远不会更新 的值dist,所以这是一个无限循环。


推荐阅读