# Rekursion



## Merowinger69 (28. Januar 2008)

Bin gerade dabei den PythagorasBaum über ein Programm zu zeichnen. So sieht der Code bis jetzt aus:


```
static void zeichneQuadrat(double n){
	
		Turtle.setColor(counter);
      if(counter<8){ counter++;
 	  }else{counter=0;}
 	  
      for(int i=0;i<4;i++){
         Turtle.forward(n);
         Turtle.right(90);
      }
   }
   static void zeichnePythagorasBaum(double n){
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3));
         Turtle.right(90);
         
          counter--;
    	  if(counter<0){ counter=8;}
 		  Turtle.setColor(counter);
 		  
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2);
         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.forward(-n);
      }
   }
```

Funktioniert auch fein doch ich will versuchen die verschiedenen Rekursionstiefen mit unterschiedlichen Farben dar zu stellen. 8 verschiedene Farben sind vorhanden.
Kann mir da jemand weiterhelfen

mfg Mero


----------



## Matze (28. Januar 2008)

Wenn du in deinem Code die Code-Tags verwendest, dann helf ich dir!


----------



## Merowinger69 (28. Januar 2008)

Sorry. Hab Tags jetzt hinzugefügt.


----------



## Matze (28. Januar 2008)

Ok.
Du könntest beispielsweise eine Variable anlegen, die dir als Zähler dient, den du bei jedem Rekursionsdurchlauf erhöhst.

Dann kannst du eine Methode schreiben die dir für eine bestimmte übergebene Zahl, eine bestimmte Farbe (oder random) zurückgibt.

Du kannst auch vorher eine HashMap anlegen, mit Schlüßel = eine Zahl und Wert = eine Farbe.

Am einfachsten ist es jedoch, wenn du einfach immer eine Zufallsfarbe verwendest.


----------



## Merowinger69 (28. Januar 2008)

Gibtes eine solche Funktion die eine RandomFarbe ausgibt oder selbst machen?

Aber ist random schon so gut den da kann es ja sein das 2 aufeinanderfolgende Rekusionen die selbe Farbe haben und somit wär das eher kontraproduktiv.

Diese Variable müsste ich auch wieder kleiner werden lassen damit die Farben passen.


----------



## Matze (28. Januar 2008)

Also ich arbeite noch mit Java 1.3 da gibt es keine RandomColor Funktion.
Ist aber auch einfach zu schreiben:
Du erzeugst 3 Zahlen von 0 - 255. Aus diesen 3 Zahlen (rot-grün-blau) erzeugst du eine neue Farbe new Color(rot, grün, blau).
Also bei mir waren die Farben scheinbar wircklich zufällig.

Fals du es mit der Zufallsmethode machst, brauchst du gar keinen Zähler.
Ob der wieder kleiner geht? Bestimmt. Aber wozu?


----------



## Merowinger69 (28. Januar 2008)

Natürlich brauch ich einen Zähler. wenn ich nur hinaufzähl dan stimmen die Farben nicht überein. sieht so aus:







sollte aber so aussehen:


----------



## Matze (28. Januar 2008)

Ok. Bei sowas kann ich dir leider kaum helfen, da ich nicht weiß wie dass berechnet wird.
Aber schau doch mal nach, ob es da ein Kriterium gibt, nach dem du den Zähler entweder ansteigen, oder abfallen lassen kannst.


----------



## Merowinger69 (28. Januar 2008)

Ja hab schon gesucht und einiges probiert aber es funktioniert einfach nicht. zu komplex

Also noch immer Hilfe gesucht!


----------



## Matze (28. Januar 2008)

Hast du schonmal mit ner Suchmaschine nach änlichen Projekte geschaut und dort mal in den Code geschaut?


----------



## deepthroat (28. Januar 2008)

Hi.

Am einfachsten wäre es, wenn du die Farbe bei jedem Aufruf der Funktion mit übergibst:

```
static void zeichnePythagorasBaum(double n, int color) {
  ...
  zeichnePythagorasBaum(n*0.5*Math.sqrt(3), (color + 1) % 8);
  ....
}
```
So wird für unterschiedliche Rekursionstiefen eine andere Farbe verwendet und die Farbe wird "automatisch" wieder zurückgesetzt wenn die Teil-Rekursion abgeschlossen ist (da die Variable color in der Funktion nie geändert wird).

Gruß


----------



## Merowinger69 (28. Januar 2008)

Also brauch jetzt noch eine Funktion die mir diese Zahl (int color) in eine Farbe umwandelt. oder hab ich da was falsch verstanden?


----------



## deepthroat (28. Januar 2008)

Merowinger69 hat gesagt.:


> Also brauch jetzt noch eine Funktion die mir diese Zahl (int color) in eine Farbe umwandelt. oder hab ich da was falsch verstanden?


Das kann ich dir nicht sagen, da ich nicht weiß wie deine Variablen und Methoden definiert sind. Ich dachte du setzt die Farbe mit *Turtle.setColor(int)*?

Gruß


----------



## Merowinger69 (28. Januar 2008)

Ja mach ich auch.


```
static void zeichneQuadrat(double n){
 	  
      for(int i=0;i<4;i++){
         Turtle.forward(n);
         Turtle.right(90);
      }
   }
   static void zeichnePythagorasBaum(double n,int color){
	   Turtle.setColor(color);
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3),(color + 1) % 8);
 		  
         Turtle.right(90);
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2,(color + 1) % 8);
         
         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.forward(-n);
 
      }
   }
```

Hast du das so gemeint? 
sieht folgend aus:






Also hat es da auch noch irgendwas.Da wird eine Seite Übermalt denk ich.


----------



## deepthroat (28. Januar 2008)

Hi.





Merowinger69 hat gesagt.:


> Hast du das so gemeint?


Ja, genau.


Merowinger69 hat gesagt.:


> sieht folgend aus:
> 
> 
> 
> ...


Ja, sieht ja schon ganz gut aus. 

Allerdings hab ich etwas Unsinn erzählt, die Farbe setzt sich nicht von allein zurück.
Du mußt nach jedem Aufruf der zeichnePythagorasBaum Methode wieder 
	
	
	



```
Turtle.setColor(color);
```
aufrufen.

Gruß

PS: Alternativ könntest du ja den Stift auch absetzen wenn du nichts zeichnen willst.

PPS: Ich hab's grad mal mit Absetzen vom Stift implementiert. Siehe Anhang.


----------



## Merowinger69 (28. Januar 2008)

Also ich habs eingefügt wie du gesagt hast aber stimmt noch immer nicht ganz aber fast. 






Übermalt mir den letzten Strich des Quadrats mit einer andere Farbe.
Möchte es gerne ohne absetzen schaffen. 
Was mach ich da noch falsch? seltsam das er das auch nur beim ersten Quadrat macht.


----------



## deepthroat (28. Januar 2008)

Hi.

Wie sieht denn dein Code jetzt aus?

Gruß


----------



## Merowinger69 (28. Januar 2008)

```
static void zeichneQuadrat(double n){
 	  
      for(int i=0;i<4;i++){
         Turtle.forward(n);
         Turtle.right(90);
      }
   }
   static void zeichnePythagorasBaum(double n,int color){
	   Turtle.setColor(color);
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3),(color + 1) % 8);
 		 Turtle.setColor(color); 
         Turtle.right(90);
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2,(color + 1) % 8);
         Turtle.setColor(color); 
         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.forward(-n);
      }
   }
```


----------



## deepthroat (28. Januar 2008)

Eigentlich ist das ja schon richtig. Du zeichnest immer in der aktuellen Farbe der Rekursionstiefe. Da aber auch Schritte notwendig sind, die nur zum Bewegen des Stifts führen sollen, muss man doch etwas tricksen, damit man die eben gezeichnete Linie mit genau der gleichen Farbe überschreibt.

Probier's mal so:
	
	
	



```
static void zeichnePythagorasBaum(double n,int color){
	   Turtle.setColor(color);
      zeichneQuadrat(n);
      if(n>1){
         Turtle.forward(n);   
         Turtle.left(30);
         zeichnePythagorasBaum(n*0.5*Math.sqrt(3),(color + 1) % 8);

         Turtle.right(90);
         Turtle.forward(n*0.5*Math.sqrt(3));
         zeichnePythagorasBaum(n/2,(color + 1) % 8);

         Turtle.forward(-n*0.5*Math.sqrt(3));
         Turtle.left(60);
         Turtle.setColor(color); 
         Turtle.forward(-n);
      }
```
Gruß


----------



## Merowinger69 (29. Januar 2008)

Ah danke jetzt funktioniert eigentlich alles richtig nur beim aller ersten Quadrat übermalt er noch die letzte(linke) Seite mit einer falschen Farbe.
Verstehe ich nicht ganz warum.


----------



## deepthroat (29. Januar 2008)

Merowinger69 hat gesagt.:


> Ah danke jetzt funktioniert eigentlich alles richtig nur beim aller ersten Quadrat übermalt er noch die letzte(linke) Seite mit einer falschen Farbe.
> Verstehe ich nicht ganz warum.


Das verstehe ich auch nicht. Bei den anderen Quadraten stimmt es?

Im Grunde wird doch auch nur an der linken Seite ein Rückschritt gemacht - und vorher wird die Farbe explizit gesetzt...

Gruß


----------

