2012-04-02 8 views
1

Ich soll dieses Sierpinski-Dreiecks-Programm so modifizieren, dass die Anzahl der Dreiecke gezählt wird. Also habe ich versucht, jedes Mal, wenn es ein Dreieck macht, die Anzahl zu erhöhen, aber irgendwie erhöht sich meine Zählung nicht.Anzahl der Dreiecke in Sierpinskis Dreieck

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

ist nicht die Antwort 'Unendlichkeit'? :-) – Tenner

+0

Es könnte einfacher sein, eine globale statische Variable zu verwenden, um die Anzahl zu verfolgen. – mellamokb

Antwort

1

Sie kehren count, aber schauen nie auf das Ergebnis SeirpTri des Aufrufs.

Statt:

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; 

versuchen so etwas wie:

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); 

Sie brauchen nicht auf die ganze Zähl-Parameter. Jeder SeirpTri Aufruf muss nur über die Dreiecke wissen, die er und seine "Kinder" (auf dem Anrufbaum) erstellt haben. Der "root" -Aufruf (in paint) wird die Gesamtsumme zurückgeben.

0

Jeder Parameter wird in Java als Wert übergeben. Das bedeutet, dass Änderungen an count nur lokal für die Methode sind und nicht das count Objekt ändern, das von der übergeordneten Methode an die Methode übergeben wird.
Sie können (und Ihr Code hat) umgehen dies durch die Rückkehr der count Param. Alles, was Sie tun müssen, ist count in Ihrer übergeordneten Methode.
Ersetzen Sie jede Zeile:

SeirpTri(...); 

mit:

count = SeirpTri(...); 
Verwandte Themen