Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung

Hallo werte Community,

ich habe hier ein Problem, das ich lösen will und habe auch schon einen
Teil geschafft. Das Programm kriegt per Kommandozeile einen Parameter,
dieser ist die Anzahl, wie oft hintereinander gewürfelt wird. Der Würfel hat
6 Seiten, zwei Seiten jeweils die selbe Farbe. Nun will ich die Kombinationen
ausgeben, die entstehen können.

Java:
public class Kombinationen {

	public static void main(String[] args) {
		
		int n = Integer.valueOf(args[0]);
		printKombinationen(n);
	}
	
	static void printKombinationen(int anzahlWurf) {
	
		char[] farbe = {'B', 'G', 'R'}; 
		for (int i = 0; i < anzahlWurf+1; ++i) {
			Out.println(farbe[i]);
		}	
	}
}

Hiermit klappt es, jedoch nur für einen Wurf. Da wird ausgegeben:
B
G
R

Ich hänge bei dem rekursiven Teil, der noch eingebaut werden muss, sodass bei zwei Würfen
zum Beispiel das hier ausgegeben wird:
BB
BG
BR
GB
GG
GR
RB
RG
RR

Habt ihr vielleicht ein paar Tips für mich?

Liebe Grüße
DD
 

Kaibear

Aktives Mitglied
Das Problem liegt darin, dass du also das komplette Array ausgeben willst, wenn ich das recht verstehe, du aber nur einen Eintrag aus dem Array angezeigt bekommst.

Was ich aus deinem Code auch noch als Problem entnehme, ist, dass du bei mehr als drei Würfen wohl einen Error bekommst. Denn du ratterst ja nur dein fabe-Array ab:

Wurf 1 ist immer B
Wurf 2 ist immer G
Wurf 3 ist immer R


Die Sache mit der Ausgabe mehrerer Elemente aus dem Array liegt aber an der Anweisung innerhalb der for-Schleife.

Da müsstest du dann eben nicht nur das Element i ausgeben.

Sähe dann in etwa so aus:

Java:
    public class Kombinationen {
     
        public static void main(String[] args) {
           
            int n = Integer.valueOf(args[0]);
            printKombinationen(n);
        }
       
        static void printKombinationen(int anzahlWurf) {
       
            char[] farbe = {'B', 'G', 'R'};
            for (int i = 0; i < anzahlWurf+1; ++i) {
                Out.println(farbe.toString()); // DAS IST DIE ÄNDERUNG
            }  
        }
    }

Aber das wäre dann vom Wurf unabhängig. Das Konzept ist dafür Murks.

Du musst über nen Zufalls-Generator die Farben zufällig zuweisen. Dazu müsstest du das Array farbe leer starten und dann auch mit integer-Werten und über nen Zufallsgenerator (in Java schon mit der Math-Klasse mitgebracht) der nur zwischen 1 und 3 wählt, füttern.

Sodass eben abhängig vom Würfel Arrays folgender Form entstehen:

farbe = [1,2,1,3,3,2] bei 6 Würfen
farbe = [2,1] bei zwei Würfen
farbe = [2,3] bei zwei Würfen etc.

Das Array wird also nach Eingabe der Würfen erstellt. Das sähe dann wie folgt aus:

Java:
int[] farbe = new int[anzahlWuerfe];
for(int i = 0; i <= anzahlWuerfe; i++){
    farbe[i] = (Math.random() * 3) + 1)
}
System.out.println(farbe.toString()) //toString() selbst schreiben.


Vom Konzept her stehen dann die Zahlen für Farben, was du aber mit einer selbstgeschriebenen toString()-Funktion umwandeln kannst, sodass eben anstatt 1 ein B, anstatt 2 ein G, anstatt 3 ein R ausgegeben wird.

Was noch zu bemängeln wäre, dass die Funktion nicht static ist und gegebenenfalls drüber nachgedacht werden sollte das Array als Rückgabe-Wert zu haben und den Print separat in einer Main-Klasse auszuführen. Aber das ist noch Wunschkonzert.
 
Zuletzt bearbeitet:

rme

Top Contributor
Zufallsgenerator? Array mit Zahlen? Hm, ich verstehe die Aufgabe wohl völlig anders. Das Problem soll ja durch Rekursion gelöst werden, daher ist der Anfang im 1. Post genau richtig. Es fehlt allerdings noch der rekursive Aufruf und eine Anpassung der Schleife:

Bei einem Wurf muss das ganze Array genau einmal ausgegeben werden, denn alle Farben sind möglich. Bei 2 Würfen muss die Methode aber auch das ganze Array genau einmal ausgeben, den Rest macht nämlich die Rekursion. Deshalb muss die Schleife das Array einfach immer exakt einmal ausgegeben, unabhängig von der Anzahl der Würfe.

Wie kommt nun der nächste Wurf zustande, wenn das Array immer nur eimal ausgegeben wird? Im Format der gewünschten Ausgabe siehst du ja, dass zuerst "B" ausgegeben wird und danach einmal das gesamte Array. Also muss die Rekursion beim Ausführen der ersten Iteration ('B') in die Rekursion gehen, damit hinter dem B alle anderen Farben einmal ausgegeben werden. Dabei entsteht nun das Problem, dass die rekursiven Aufrufe irgendwie wissen müssen, dass das B ausgegeben werden soll, denn wenn die aufrufende Funktion es vor der Schleife ausgibt, wird es nur beim 1. rekursiven Aufruf ausgegeben. Eine mögliche Lösung wäre es, in der Schleife keine Ausgabe zu machen, sondern den Ausgabe-String dynamisch zusammenzusetzen und den rekursiven Aufrufen mitzugeben, d.h. du erweiterst die Methode um einen Parameter vom Typ String und einen Rückgabewert vom Typ String. Sie wird dann mit "" als Ausgabe aufgerufen, fügt dort in der 1. Iteration 'B' hinzu und die Rekursionen hängen dann jeweils ihre Ausgaben an den String und rufen wieder rekursiv auf, in der 1. Iteration der 2. Stufe also "BB".

Wie erkennst du nun, wann die Rekursion zu Ende ist? Dazu könntest du den Parameter anzahlWurf in jeder Stufe dekrementieren. Also wenn du initial mit 3 aufrufst, bekommt die nächste Stufe 2, die nächste 1 usw. Dann erkennst du nämlich, wann der letzte Würfel gefallen ist und kannst den dynamisch zusammengebauten String ausgeben, statt wieder in die Rekursion zu gehen.
 

Kaibear

Aktives Mitglied
Zufallsgenerator? Array mit Zahlen? Hm, ich verstehe die Aufgabe wohl völlig anders. Das Problem soll ja durch Rekursion gelöst werden, daher ist der Anfang im 1. Post genau richtig. Es fehlt allerdings noch der rekursive Aufruf und eine Anpassung der Schleife:

Bei einem Wurf muss das ganze Array genau einmal ausgegeben werden, denn alle Farben sind möglich. Bei 2 Würfen muss die Methode aber auch das ganze Array genau einmal ausgeben, den Rest macht nämlich die Rekursion. Deshalb muss die Schleife das Array einfach immer exakt einmal ausgegeben, unabhängig von der Anzahl der Würfe.

Wie kommt nun der nächste Wurf zustande, wenn das Array immer nur eimal ausgegeben wird? Im Format der gewünschten Ausgabe siehst du ja, dass zuerst "B" ausgegeben wird und danach einmal das gesamte Array. Also muss die Rekursion beim Ausführen der ersten Iteration ('B') in die Rekursion gehen, damit hinter dem B alle anderen Farben einmal ausgegeben werden. Dabei entsteht nun das Problem, dass die rekursiven Aufrufe irgendwie wissen müssen, dass das B ausgegeben werden soll, denn wenn die aufrufende Funktion es vor der Schleife ausgibt, wird es nur beim 1. rekursiven Aufruf ausgegeben. Eine mögliche Lösung wäre es, in der Schleife keine Ausgabe zu machen, sondern den Ausgabe-String dynamisch zusammenzusetzen und den rekursiven Aufrufen mitzugeben, d.h. du erweiterst die Methode um einen Parameter vom Typ String und einen Rückgabewert vom Typ String. Sie wird dann mit "" als Ausgabe aufgerufen, fügt dort in der 1. Iteration 'B' hinzu und die Rekursionen hängen dann jeweils ihre Ausgaben an den String und rufen wieder rekursiv auf, in der 1. Iteration der 2. Stufe also "BB".

Wie erkennst du nun, wann die Rekursion zu Ende ist? Dazu könntest du den Parameter anzahlWurf in jeder Stufe dekrementieren. Also wenn du initial mit 3 aufrufst, bekommt die nächste Stufe 2, die nächste 1 usw. Dann erkennst du nämlich, wann der letzte Würfel gefallen ist und kannst den dynamisch zusammengebauten String ausgeben, statt wieder in die Rekursion zu gehen.

So kann man die Aufgabe natürlich auch verstehen. Es ist jetzt die Frage, ob er alle Kombinationen erhalten will oder eine spezifische...
 

rme

Top Contributor
Der gewünschten Ausgabe (9 Ausgaben bei 2 Würfen mit 3 Elementen) habe ich entnommen, dass er alle will :)

Nachtrag: Ich hab's gerade mal selbst ausprobiert, das mit dem Rückgabewert ist nicht einmal erforderlich. Einfach die Ausgabe durchschleifen und bei anzahlWurf == 0 ausgeben, ansonsten in die Rekursion gehen. Ich musste eigentlich nur 2 Zeilen anpassen und den Parameter hinzufügen, du bist also schon fast fertig. Ist eher eine Denkaufgabe :)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Kombinationen einer Menge rekursiv berechnen Java Basics - Anfänger-Themen 11
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
T Rekursiv Vokale zählen Java Basics - Anfänger-Themen 19
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
S Stringlänge Rekursiv ermitteln Java Basics - Anfänger-Themen 2
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6
0 a hoch b rekursiv - wie stoppen? Java Basics - Anfänger-Themen 3
T Ordnerstrucktur rekursiv auslesen Java Basics - Anfänger-Themen 9
G Rekursiv die größte Zahl eines Arrays Java Basics - Anfänger-Themen 6
G Rekursiv Array Elemente quadrieren Java Basics - Anfänger-Themen 2
N Fibo Zahlen:iterativ,rekursiv Anzahl der Additionen zählen Java Basics - Anfänger-Themen 2
P Permutationen einer Tour rekursiv Java Basics - Anfänger-Themen 4
G Baumstruktur rekursiv durchlaufen Java Basics - Anfänger-Themen 2
B Kürzesten Weg zwischen mehreren Punkten finden (rekursiv) Java Basics - Anfänger-Themen 5
J BinBaum rekursiv ausgeben Java Basics - Anfänger-Themen 9
W Rekursiv Zeichen einfügen Java Basics - Anfänger-Themen 6
M Verzeichnisse rekursiv durchlaufen und dann RegEx Java Basics - Anfänger-Themen 6
G Array rekursiv teilen und aufsummieren Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben