2012-04-02 180 views
1

我应该修改这个谢尔宾斯基的三角形程序来计算三角形的数量。所以我试图在每次制作三角形时增加计数,但不知何故,我的计数不会增加。计算谢尔宾斯基三角形中三角形的数量

public class SierpinskiTriangle extends Applet 
{ 

    public int SeirpTri(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3, int n, int count) 
    { 
     this.setBackground(new Color(0,0,0)); 
     this.setSize(700, 500); 
     if (n == 0) 
     { 
      g.setColor(new Color(0, 255, 0)); 
      g.drawLine(x1, y1, x2, y2);  // if n = 0 draw the triangle 
      g.drawLine(x2, y2, x3, y3); 
      g.drawLine(x3, y3, x1, y1);   
      return 1;  
     } 

     int xa, ya, xb, yb, xc, yc; // make 3 new triangles by connecting the midpoints of 
     xa = (x1 + x2)/2;    //. the previous triangle 
     ya = (y1 + y2)/2; 
     xb = (x1 + x3)/2; 
     yb = (y1 + y3)/2; 
     xc = (x2 + x3)/2; 
     yc = (y2 + y3)/2; 
     SeirpTri(g, x1, y1, xa, ya, xb, yb, n - 1, count++); // recursively call the function using the 3 triangles 
     SeirpTri(g, xa, ya, x2, y2, xc, yc, n - 1, count++); 
     SeirpTri(g, xb, yb, xc, yc, x3, y3, n - 1, count++); 
     return count; 
    } 

    public void paint(Graphics g)  
    { 
     int recursions = 3; 
     int count=1; 
     // call the recursive function sending in the number of recursions 
     SeirpTri(g, 319, 0, 0, 479, 639, 479, recursions, count); 

     // Counting triangles using math algorithm; 
     int count2 = 1; 
     if (recursions ==0) { 
      count2 =1; 
     } 
     else { 
      count2 = (int) Math.pow(3,(recursions-1)) * 3; 
     } 
     System.out.println("Correct answer is: " +count2); 
     System.out.println("Answer using recurvise is: " +count*3); 
    }   
} 
+0

不是答案 '无穷大'? :-) – Tenner 2012-04-02 17:32:28

+0

可能更容易使用全局静态变量来跟踪计数。 – mellamokb 2012-04-02 17:34:19

回答

1

将返回count,但从来不看调用SeirpTri的结果。

相反的:

SeirpTri(g, x1, y1, xa, ya, xb, yb, n - 1, count++); // recursively call the function using the 3 triangles 
SeirpTri(g, xa, ya, x2, y2, xc, yc, n - 1, count++); 
SeirpTri(g, xb, yb, xc, yc, x3, y3, n - 1, count++); 
return count; 

尝试类似:

return 
    SeirpTri(g, x1, y1, xa, ya, xb, yb, n - 1) 
    + SeirpTri(g, xa, ya, x2, y2, xc, yc, n - 1) 
    + SeirpTri(g, xb, yb, xc, yc, x3, y3, n - 1); 

你不需要count参数都没有。每个SeirpTri调用只需知道它及其“子”(在调用树上)创建的三角形。 “根”电话(在paint)将返回总计。

0

每个参数都是按Java值传递的。这意味着对count的任何更改只会在方法的本地,并且不会更改从父方法传递到方法中的count对象。
你可以(和你的代码)通过返回count参数来解决这个问题。你所需要做的就是在你的父方法中设置count
替换每一行:

SeirpTri(...); 

有:

count = SeirpTri(...);