2012-04-02 221 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(...);