Java递归构造函数

时间:2016-02-25 01:13:15

标签: java recursion constructor

我需要一些基本的帮助。我很迷茫。我正在尝试创建一个分形三角形,这基本上意味着每个三角形创建3个子三角形。

我的课程由两个构造者组成,一个是公共的,一个是私人的。公共构造函数的目的是创建自己,然后创建另外3个孩子'三角形物体。 (三角形的等级数量基于可变深度,因此深度1仅表示一个大三角形,深度2表示1个大三角形和3个子三角形等。)

我想我的大问题是如何递归调用私有构造函数,以便它可以将自己用作父级?

这是我想要创建的动画的链接(只是三角形)https://drive.google.com/file/d/0B_Tq6mYckE93clFZRnVIMHZBZms/view?usp=sharing

另外:_parent.makeTriangle(points [0],points [1])创建一个' ATriangle'并返回它..如果你想知道那是什么。

    public FractalTriangle( int depth, ATriangle tri, int height )
   {
      this(tri,null,depth);

      // set up values of instance variables
      _depth    = 1;
      _p2height = height;
      _parent = null;
      _tri = tri;

      ////////////////////////////////////////////////
      // Set the triangle's color to a value that depends
      // on its depth.
      //
      // Generate the children triangles for this root.
      // Make sure your code for this is as clean and
      // modular as possible.
      /////////////////////////////////////////////////////

      if( depth > 1 )
      {
         trianglelist = new Vector<FractalTriangle>();
         Point points[] = tri.getPoints();
         FractalTriangle f1 = new FractalTriangle( _parent.makeTriangle( points[0], points[1]), this, depth-1 );
         FractalTriangle f2 = new FractalTriangle( _parent.makeTriangle( points[1], points[2]), this, depth-1 );
         FractalTriangle f3 = new FractalTriangle( _parent.makeTriangle( points[2], points[0]), this, depth-1 );
         trianglelist.add( f1 );
         trianglelist.add( f2 );
         trianglelist.add( f3 );
      }

   }
   /**
    * recursive constructor; it's private, so can only be called from methods
    * of this class. It will get called by the public FractalTriangle.
    */
   private FractalTriangle ( ATriangle tri, FractalTriangle parent, int depth )
   {
_parent = parent;
      _depth = depth;
      _tri = tri;
      ///////////////////////////////////////////////////////////
      // get parent's height from parent parameter to compute this height
      //
      // save other parameters in instance variables
      //
      // recursively create children -- only if recursion depth limit hasn't
      // been reached and the minimum height test passes
      ///////////////////////////////////////////////////////////
      if( depth > 1 )
      {
         trianglelist = new Vector<FractalTriangle>();
         Point points[] = tri.getPoints();
         FractalTriangle f1 = new FractalTriangle( this.makeTriangle( points[0], points[1]), this, depth-1 );
         FractalTriangle f2 = new FractalTriangle( this.makeTriangle( points[1], points[2]), this, depth-1 );
         FractalTriangle f3 = new FractalTriangle( this.makeTriangle( points[2], points[0]), this, depth-1 );
         trianglelist.add( f1 );
         trianglelist.add( f2 );
         trianglelist.add( f3 );
      }

   }

2 个答案:

答案 0 :(得分:0)

这将是一个不必要的复杂解决方案。它可以用java中的简单树来解决。

您无法在java中调用私有构造函数。您必须有一个可以调用的静态方法,而无需实例化一个返回该类实例的类。私有构造函数仅在单例设计模式中有用。但这不会解决你的问题。 http://www.oodesign.com/singleton-pattern.html

如果你仍然想要走这条路线就是一个例子。
What is the possible benefit (if any) of allowing recursive constructors?

即使没有私有构造函数,您的代码也将以递归方式工作。但是如果你想使用私有构造函数,这是你可以递归调用私有构造函数的唯一方法。

    {
    ...
    FractalTriangle f1 = FractalTriangle.createFractalTriangle( _parent.makeTriangle( points[0], points[1]), this, depth-1 );
    ...
   }

   public static FractalTriangle  createFractalTriangle(ATriangle tri, FractalTriangle parent, int depth ){
           return  new FractalTriangle( _parent.makeTriangle( points[0], points[1]), this, depth-1 );
    }

创建一个返回类实例的静态方法。

答案 1 :(得分:0)

而不是两个构造函数,为什么不执行以下操作:

public FractalTriangle ( ATriangle tri, FractalTriangle parent, int depth, int height, int numberOfChild )
   {
      if(null != parent){
          _parent = parent;
          _p2height = height;
          _depth = depth;
        }else{
          depth =1;
          _parent= null;
        }
      _tri = tri;
      ...
      for(int i=0; i < numberOfChild; i++){
            FractalTriangle child = new FractalTriangle(tri, this, 3, 0, 0);
      }
   }

致电:

   FractalTriangle parent = new FractalTriangle(tri, null, 1, 1, 3);