# Wieviele Möglichkeiten gibt es?



## chillerStudent (19. Dez 2011)

Guten Tag lieber Helfer,

ich muss ein Programm schreiben, dass bei der Eingabe (Kommandozeilenparameter) mir alle Permutationen ausgibt. Zum Beispiel:

Eingabe: abcd

Ausgabe:

abcd
dc
cbd
db
dbc
cb
bacd
dc
cad
da
dac
ca
cabd
db
bad
da
dab
ba
dabc
cb
bac
ca
cab
ba

Ich möchte dieses Programm gerne hier zusammen erstellen. Noch hab ich nichts dazu geschrieben. Ich brauche Hilfe beim Ansatz. Reicht hier ein Array? und ist es besser wenn ich mit char programmiere oder mit String, also mit StringBuffer ? 
Kann mir hier jemand in Worten erklären wie ich anfangen kann/soll ? 

Danke schon mal an alle die mir helfen werden.


----------



## Gast2 (19. Dez 2011)

Als Ansatz sollte dir das hier dienen können:
http://www.java-forum.org/codeschnipsel-u-projekte/81973-combinatorics.html


----------



## timbeau (19. Dez 2011)

{c,d} ist aber keine Permutation von {a,b,c,d}


----------



## chillerStudent (19. Dez 2011)

timbeau hat gesagt.:


> {c,d} ist aber keine Permutation von {a,b,c,d}



sry sry.  Also da wo leezeichen davor sind kommt immer ein Buchstabe.


```
abcd
   dc    // von hier...
 cbd
   db
 dbc
   cb    // bis hier kommt ein [B]a[/B] davor
bacd
   dc    // von hier...
 cad
   da
 dac
  ca    // bis hier kommt ein [B]b[/B] davor usw.
cabd
   db
 bad
   da
 dab
   ba
dabc
   cb
 bac
   ca
 cab
   ba
```


----------



## chillerStudent (19. Dez 2011)

EikeB hat gesagt.:


> Als Ansatz sollte dir das hier dienen können:
> http://www.java-forum.org/codeschnipsel-u-projekte/81973-combinatorics.html



Danke für den link. Aber leider kann ich noch nicht mit implements umgehen und sind auch nicht erwünscht.

so hab ich angefangen:


```
public static void main(String[] args) {
		
		int fac = fact(args.length);
		
		int[] a = new int[fac];


	}
	static int fact(int n) {
		int akku = 1;
		while (n != 1) {
		akku *= n;
		--n;
		}
		return akku;
		}
```

Die Idee ist, dass ein Buchstabe weggedacht wird (im Beispiel a) und mit dem Rest (im Beispiel bcd) die Ausgabe erzeugt wird. Dann soll b weggedacht werden und mit acd permutiert werden. Zum Schluss einfach der weggedachte Buchstabe dazudenken. :autsch:


----------



## langhaar! (19. Dez 2011)

chillerStudent hat gesagt.:


> Die Idee ist, dass ein Buchstabe weggedacht wird (im Beispiel a) und mit dem Rest (im Beispiel bcd) die Ausgabe erzeugt wird. Dann soll b weggedacht werden und mit acd permutiert werden. Zum Schluss einfach der weggedachte Buchstabe dazudenken. :autsch:



Rekursion. Sind nur wenige Zeilen.


----------



## chillerStudent (19. Dez 2011)

langhaar! hat gesagt.:


> Rekursion. Sind nur wenige Zeilen.



mhh... wollt ich eigentlich nicht, aber wenns deutlich weniger Zeilen sind, dann versuch ichs damit. 

Reicht da eine Methode?


----------



## njans (19. Dez 2011)

Du kannst es auch iterativ machen. Dabei ist das Vorgehen recht "simpel":
Du betrachtest den String als eine Menge an Elementen und bildest alle Kombinationen von jedem Element mit jedem Anderen.
Diese neuen Elemente kombinierst du dann wieder mit allen Elementen. Diesen Vorgang machst du so lange, bis du alel Elemente der länge "abc".length hast.
So bekommst du auf jeden Fall alle Teilmengen, sofern das auch gewünscht ist.


----------



## chillerStudent (19. Dez 2011)

njans hat gesagt.:


> Du kannst es auch iterativ machen. Dabei ist das Vorgehen recht "simpel":
> Du betrachtest den String als eine Menge an Elementen und bildest alle Kombinationen von jedem Element mit jedem Anderen.
> Diese neuen Elemente kombinierst du dann wieder mit allen Elementen. Diesen Vorgang machst du so lange, bis du alel Elemente der länge "abc".length hast.
> So bekommst du auf jeden Fall alle Teilmengen, sofern das auch gewünscht ist.



meinst du so?


```
public static void main(String[] args) {

		String st = "";
		for(int i=0; i<args.length; i++) {
		    st += args[i];
		}
		char[] a = st.toCharArray();
		
		StringBuffer b = new StringBuffer();
		
		for(int i=0; i<a.length; i++){
			b.append(a[i]);
		}
		
	}
```

aber wie bilde ich die kombination?


----------



## chillerStudent (20. Dez 2011)

Ich hab nun das Programm "geschrieben", mit Hilfe von google. Allerdings muss es genau diese Reihenfolge eingehalten werden:
Alle Kombinationen mit dem Anfangsindex 'a' müssen zu erst ausgegeben werden, dann alle dem Anfangsindex 'b' usw.

Also es soll *exakt *das hier ausgeben:


```
abcd
   dc    // von hier...
 cbd
   db
 dbc
   cb    // bis hier kommt ein [B]a[/B] davor
bacd
   dc    // von hier...
 cad
   da
 dac
  ca    // bis hier kommt ein [B]b[/B] davor usw.
cabd
   db
 bad
   da
 dab
   ba
dabc
   cb
 bac
   ca
 cab
   ba
```

Es ist aber nicht wichtig, ob die Anfangsbuchstaben davor stehen oder nicht. Im Beispiel ist es übersichtshalber so ausgegeben.

Hier ist die die methode print:


```
static void print(char[] a) {
    	if( a[0] == 'a'){
    		a[0] = ' ';
    	}
    	System.out.println(String.valueOf(a));
    }
```


----------



## Michael... (20. Dez 2011)

chillerStudent hat gesagt.:


> Ich hab nun das Programm "geschrieben", mit Hilfe von google. Allerdings muss es genau diese Reihenfolge eingehalten werden:


Und wie sieht der Code aktuell aus? Wenn man das mit Rekursion löst, bekommt man "automatisch" eine solche Ausgabe.


chillerStudent hat gesagt.:


> Es ist aber nicht wichtig, ob die Anfangsbuchstaben davor stehen oder nicht. Im Beispiel ist es übersichtshalber so ausgegeben.
> 
> Hier ist die die methode print:
> 
> ...


Was ist an der Ausgabe übersichlicher? es ist doch besser zu erkennen, wenn alle Buchstaben ausgegeben werden. Und die print ist Schmarrn. Hier werden Daten verändert (eventuell macht es ja nichts aus) und falls an erster Stelle ein 'a' steckt wird ein Leerzeichen ausgeben. Das soll es wohl nicht sein.


----------



## chillerStudent (20. Dez 2011)

> Und wie sieht der Code aktuell aus?



so:

Binäre Suche ? Wikipedia

der rekursive Teil.

EDIT
Sorry, vergisst bitte diesen Beitrag. Mache grad zwei Aufgaben Parallel.

EDIT2
Hier ist der Code:

Alle möglichen Kombinationen @ tutorials.de: Tutorials, Forum & Hilfe


----------



## ROSAI (20. Dez 2011)

Java string permutation


----------



## chillerStudent (20. Dez 2011)

ROSAI hat gesagt.:


> Java string permutation



Was müsste man in diesem Code hinzufügen wenn man statt den Anfangsbuchstaben ein leerzeichen einfügen möchte?


----------



## timbeau (20. Dez 2011)

Kannst die Dinger ja auch in eine Liste packen, sortieren und dann nach dem ersten a, die .replace Methode nutzen.


----------



## chillerStudent (20. Dez 2011)

Das Problem: 

Da wir das Thema Listen noch nicht behandelt haben, dürfen wir diesen nicht benutzen. 

Gibts es eine andere Idee?


----------



## Michael... (20. Dez 2011)

Man könnte die Ausgaben mitzählen und bei einem Vielfachen von (n-1)! den kompletten String ausgeben, bei allen anderen Ausgaben gibt man ein Leerzeichen und den String ab Index 1 aus.

wobei: n = Länge des Strings -1


----------

