Rekursion

buffy2299s

Mitglied
Hallo Leute,
ich soll ein Programm schreiben was folgendes auf der Kommandozeile ausgibt:
****
***
**
*
**
***
****
Dies jedoch ohne Schleifen und nur mit Rekursion!
Bis jetzt hab ich den 1.Teil geschafft, aber den zweiten leider nicht. Kann mir jemand helfen?
Code:
import java.util.*;

public class Sternchen {
   
      public static void main(String... args) {
              Scanner scan = new Scanner(System.in);
              System.out.print("Bitte geben Sie die Anzahl der Sternchen an: ");
              int a = scan.nextInt();
              scan.close();
            printPyramidi(a);
           
          
          }
        
          private static void printPyramidi(int a){
            printPyramid(a, (a*2-1));
          }
       
        
          public static void printPyramid(int i, int a) {
             
              if (i < a) {
              printLine(i);
              System.out.println();
              printPyramid(i-1, a-1);
              printLine(i);
              System.out.println();
            }    
              else {
                  printLine(i);
                  System.out.println();
               
                }
          }
         
   
        
          private static void printLine(int a) {
            if (a > 0) {
              printLine(a - 1);
              System.out.print("*");
            }
          }
}
 

buffy2299s

Mitglied
Was genau meinst du mit höhendifferenz? An sich geht es ja darum das der Benutzer die Mindestanzahl an Sterne eingeben kann. Sei es 5 werden die Sterne bis 1 abwärts ausgeben und dann ab 2 hochwärts bis 5
 

Meniskusschaden

Top Contributor
Du rechnest die Höhe (Anzahl Zeilen) für die Gesamt-Pyramide doch schon aus: (a*2-1). Später gibst du dann rekursiv die jeweils nächstkleinere Pyramide aus und übergibst dabei deren Höhe.
 

buffy2299s

Mitglied
Ach so ja genau. Die Zeilen ergeben sich ja eigentlich aus a*2-1 also sprich für 4 wären es 7 für 5 wären 9 und so weiter. Also ergibt sich ja durch die gleichen die Anzahl der Zeilen also für : 1.**** 2.*** 3.** 4.* 5.** 6.*** 7.****
 

buffy2299s

Mitglied
Also hab mal das gemacht, nur das Problem jetzt ist, dass es mir dieses hier ausgibt:
*****
*
**
***
****
*****
****
***
**
*
und ich will ja das hier:

*****
****
***
**
*
**
***
****
*****

Code:
import java.util.*;

public class Sternchen {
   
      public static void main(String... args) {
              Scanner scan = new Scanner(System.in);
              System.out.print("Bitte geben Sie die Anzahl der Sternchen an: ");
              int a = scan.nextInt();
       
              scan.close();
            printPyramidi(a); 
            printPyramidi2(a);
          }
     
         public static void printPyramidi(int a){
            printPyramid(a, (a*2-a));
          }
         public static void printPyramidi2(int a){
                printPyramid2(1, a);
              }
            
              private static void printPyramid2(int g, int a) {
                if (g < a) {
                  printLine(g);
                  System.out.println();
                  printPyramid2(g + 1, a);
                  printLine(g);
                  System.out.println();
                } else {
                  printLine(g);
                  System.out.println();
                }
              }
        
          private static void printPyramid(int i, int a) {
              if (i < a) {
              printLine(i);
              System.out.println();
              printPyramid(i-1, a);
              printLine(i);
              System.out.println();
            }    
              else {
                  printLine(i);
                  System.out.println();
               
                }
          }
         
          private static void printLine(int a) {
               if (a > 0) {
                   printLine(a - 1);
                   System.out.print("*");
               }
          }
         
         
        
            
           
}
 

Meniskusschaden

Top Contributor
Ich beziehe mich jetzt noch mal auf den Code aus Post #1, weil das meines Erachtens dichter an der Lösung ist. Man kann ja mal ein paar Schritte für n=5 durchspielen, die dein Programm machen würde:
Code:
printPyramid(5, 9);  // 5er-Pyramide der Höhe 9 ausgeben
   printline(5); // 5er-Zeile ausgeben
   printPyramid(4, 8); // 4er-Pyramide der Höhe 8 ausgeben
      printline(4); // 4er-Zeile ausgeben
      printPyramid(3, 7); // 3er-Pyramide der Höhe 7 ausgeben
         ...
      printline(4); // 4er-Zeile ausgeben
   printline(5); // 5er-Zeile ausgeben
 

buffy2299s

Mitglied
Wenn ich das so sehe müsste es doch eigentlich richtig sein? Verstehe einfach nicht, wieso es nach dem 1 Sternchen abbricht und nicht wie gewünscht dann wieder hochzählt
 

buffy2299s

Mitglied
Eclipse zeigt mir ja auch an das der Fehler bei
Code:
 printPyramid(i-1, a-1);
liegt, aber ich weiß nicht was ich da ändern muss
 

Meniskusschaden

Top Contributor

buffy2299s

Mitglied
nein eine 4er Pyramide hat ja dann die Höhe 7, einer 5er 9 also immer n*2-1, und der Höhenunterschied zwischen einer Pyramide und der nächstkleineren ist ja immer 1
 

buffy2299s

Mitglied
Ok hab mein Fehler erkannt, müsste ja dann natürlich auch 2*a-1 heißen, logisch. Jetzt ist es aber so das es noch nicht ganz perfekt ist, da java gerade das ausgibt

Code:
****
***
**
*







































































































*
**
***
****
also es sind wirklich so viele Leerzeilen dazwischen, und außerdem hab ich ja jetzt zwei mal ein Sternchen
 
Zuletzt bearbeitet von einem Moderator:

buffy2299s

Mitglied
Ok gut hab das jetzt mit den Leerzeilen auch hinbekommen musst statt-1 einfach nur -2 sein, aber wie schaff ich es jetzt das es nicht bei 1 wieder hochzählt sondern bei 2. Ich bräuchte ja dann eine Art Abbruchbedingung die sagt ah wenn du bei 1 angekommen bist mach bei 2 weiter
 

Meniskusschaden

Top Contributor
Dein Ansatz ist komplizierter als er sein müsste, denn im Grunde genommen ist deine Abfrage if (i < a) und die zugehörige Höhenberechnung nur ein etwas umständlicher Weg, um zu prüfen, ob du bei der 1 angekommen bist. Du könntest printPyramid() stattdessen auch einfach nur die Sternchen-Anzahl übergeben und dort dann direkt auf 1 prüfen. Das wäre übersichtlicher und du würdest sogar die Methode printPyramidi() einsparen. Wenn du dann bereits ab 2 hochzählen möchtest, kannst du dort eben einfach auf 2 statt auf 1 prüfen.
 

Meniskusschaden

Top Contributor
Mit deinem Code aus Post 1 und den beiden Korrekturen bekomme ich für n=5 folgendes:
Code:
*****
****
***
**
***
****
*****
So soll es jetzt doch aussehen, oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Rekursion Aufrufbaum Allgemeine Java-Themen 7
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
Zeppi Rekursion StackOverflowError Allgemeine Java-Themen 4
J Rekursion Allgemeine Java-Themen 4
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
B Rekursion Allgemeine Java-Themen 11
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
J Rekursion Mergesort Allgemeine Java-Themen 10
R Rekursion Allgemeine Java-Themen 3
R Programm zur Rekursion Allgemeine Java-Themen 5
V Rekursion Allgemeine Java-Themen 2
J Denkfehler Rekursion Allgemeine Java-Themen 5
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
B Rekursion Allgemeine Java-Themen 2
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
Hacer Rekursion- sumOfAllNodes Allgemeine Java-Themen 5
L Rekursion Binärbaum Allgemeine Java-Themen 7
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
Y Rekursion Allgemeine Java-Themen 19
M Permutation ohne Wiederholung mit rekursion Allgemeine Java-Themen 4
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
P Rekursion Allgemeine Java-Themen 9
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
W Rekursion-Probleme mit return Allgemeine Java-Themen 35
C Rekursion Fibonacci Allgemeine Java-Themen 31
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
eQuest Rekursion Dauer Allgemeine Java-Themen 6
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
L fragwürdige Rekursion Allgemeine Java-Themen 4
L Kleine Rekursion Allgemeine Java-Themen 12
M Rekursion!! Allgemeine Java-Themen 8
J Rekursion in Schleifenkonstrukt wandeln Allgemeine Java-Themen 21
R Rekursion Ablauflogik Allgemeine Java-Themen 19
M Rückwärts geführte Rekursion Allgemeine Java-Themen 3
Schandro StackOverflowError bei Rekursion verhindern Allgemeine Java-Themen 14
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
G Rekursion - Denksport Allgemeine Java-Themen 6
S Rekursion und StackOverflow Allgemeine Java-Themen 11
P Stackoverflow in Rekursion. Bin ich schuld oder Java? Allgemeine Java-Themen 9
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S Rekursion Allgemeine Java-Themen 2
Linad Tiefe der Rekursion als Abbruchbedingung Allgemeine Java-Themen 6
Linad Zahlensysteme -> Rekursion Allgemeine Java-Themen 4
N Frage zu einer Rekursion Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben