Raute rekursiv programmieren?

1 Antwort

1) Bitte formatiere deinen Code via Quelltext-Tool von GF.

2) Wieso benennst du nicht alle deine Methoden eindeutig? So muss man erst schauen, was methode1 und methode2 tun.

3) Du nutzt ziemlich oft println, obwohl du doch Sternchen und Leerzeichen in einer Zeile haben möchtest.

4) Nutze das Prinzip von Teile und Herrsche. Zerstückel also - was brauchst du? Im Prinzip gibst du lediglich mehrere Zeilen aus und pro Zeile gibt es eine Anzahl an Leerzeichen und danach eine Anzahl an Sternchen, die ausgegeben werden müssen.

Fangen wir also mit der plumpen Ausgabe an:

private static void drawTokens(int count, char token) {
  for (int i = 0; i < count; ++i) {
     System.out.print(token);
  }
}

Dann wissen wir, dass wir, wenn wir die Raute zerlegen, 2 Pyramiden haben, die ausgegeben werden müssen. Dabei kommen entweder 2 Sternchen hinzu oder weg (angefangen bei 1) und die Leerzeichen laufen von der breitesten Stelle bis zur halben Höhe - 1.

Erst einmal wird die Grundstruktur zum Zeichnen einer Rautenhälfte definiert. Die Leerzeichen werden geschrieben, dann die Sternchen. Danach kommen Sternchen hinzu (2 oder -2) und Leerzeichen (1 oder -1).

for (int row = 1; row <= height; ++row) {
   drawTokens(spaces, ' ');
   drawTokens(stars, '*');
            
   stars += addStars;
   spaces += addSpaces;
            
   System.out.println();
}

Damit müssen nur noch die Startwerte von stars und spaces bestimmt werden.

  • obere Hälfte: Sternchen = 1 und Leerzeichen Höhe - 1
  • untere Hälfte: Sternchen = 2 * (Höhe - 1) + 1 und Leerzeichen 1

Möglicher Methodenaufrufe zum Zeichen beider Rautenhälften:

height = (height + 1) / 2;

drawHalfDiamond(height, 1, height - 1, 2, -1);
drawHalfDiamond(height 2 * (height - 1) + 1, -2, 1);

regex9  20.12.2017, 04:35

Aje, ich habe gerade gesehen, dass ich bei dieser Antwort wohl nicht bei der Sache war. Gefordert war ja eine rekursive Lösung, keine iterative. Nun habe ich mich natürlich bemüht und wollte gerade ein Update abschicken, da bin ich durch Zufall noch einmal auf deine Quelle gestoßen, von der du ganz offensichtlich den Code Copy&Paste übernommen hast. Lustigerweise hast du es trotzdem geschafft, Fehler einzubauen, daher würde ich vorschlagen, du versuchst es noch einmal und verwendest diesmal gleich eigene, sinnvolle Methodenbezeichner. 😋

Lies außerdem auch die Kommentare weiter unten.

https://stackoverflow.com/questions/24792250/recursion-in-java-dealing-with-diamonds

0
FF111 
Fragesteller
 20.12.2017, 10:02
@regex9

Ich habe mir das ganze angeschaut. Tatsächlich hatte ich aus einem anderen Forum einen Artikel als Inspiration genommen. Allerdings nicht diesen^^ Aber scheinbar war war die Person genauso unkreativ bei der Namengebung :D Aber das sei jetzt mal dahin gestellt. Jetzt bekomme ich eine wunderschöne Raute ausgegeben. Und mir fällt auf, dass ich ebenso einen Denkfehler hatte. Meine eigentliche geforderte Höhe ist jetzt meine Breite.

Wenn ich das nicht rekursiv darstellen würde, dann hätte ich zwei geschachtelte Schleifen mit dem Inhalt:

if ((groesse / 2) < Math.abs((groesse / 2) - j)

+ Math.abs((groesse / 2) - i))

.die dann ein Leeres zeichen ausgeben, ansonsten ein Sternchen.

Ich frage mich aber gerade nur, wie ich (groesse/2-j) rekursiv darstellen soll...

angenommen ich schreibe jetzt eine Methode die heißt methode1 :p und ich habe die Bedingung

if(groessse>0){

return " "+methode1((groesse/2)- methode1);

}else{

return "*";

}

Aber das sieht so verdammt falsch aus...

0
regex9  20.12.2017, 10:50
@FF111

Ich verstehe das Problem derzeit nicht, es sollte mit dem oberen Link doch bereits gelöst sein?

0