Permutation ohne Rekursion

Status
Nicht offen für weitere Antworten.

nadoria

Mitglied
Hallo an alle,

ich muss diese Aufgabe lösen, aber mir fällt leider kein (funktionierender) Algorithmus ein. Es sollen verschachtelte while-Schleifen genutzt werden.. (bin aber auch für andere Lösungsansätze dankbar..) (Keine Rekursion, keine Listen, nur Arrays bzw ein Array..)



Hier die Aufgabe:

Permutationen
Schreiben Sie eine Java-Klasse Permutation mit einer Methode permute, die ein int-Array der Länge n als Eingabe hat und alle Permutationen der Zahlen im Array ausgibt.
Als Permutationen einer Menge bezeichnet man Vertauschungen der einzelnen Elemente. Beispiel:
public class PermutationTest {
public static void main(String[] args) {
int[] k = {1,2,3};
Permutation.permute(k);
}
}
Die main-Methode soll alle Kombinationen von Vertauschungen der Zahlen 1,2 und 3 auf den Bildschirm ausgeben:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
Testen Sie Ihr Programm mit den Werten {1,2,3} und {1,2,3,4}.
Hinweis: Für ein Array x enthät x.length die Länge des Arrays x.
 
S

SlaterB

Gast
denkbar wäre eine Variante mit nur einer while-Schleife und mehreren Zustands-Hilfsvariablen + -Arrays, die quasi die Rekursion nachbauen,

wenn du die Rekursion noch nicht kennst, dann solltest du die zuerst ausprobieren, auch wenn du sie später nicht verwenden darfst (was diese Unlogik zeigt),
hilft beim Verständnis,

dann also eine große while(true)-Schleife,
ein Array (act) so groß wie k, in dem die aktuell verwendeten Elemente markiert werden,
eine int-Variable für den aktuellen Zustand

der Zustand ist anfangs 0 und wird pro Schleifendurchlauf um 1 erhöht,

im ersten Durchlauf also Zustand 1, das heißt dass es um das erste Element geht,
das act-Array zeigt an, dass noch alle Zahlen zur Auswahl stehen,
also wird jetzt das erste Element aus k für Position 1 ausgewählt
und dies in act vermerkt,

nächste Runde, Zustand 2, 2 wird ausgewählt,
nächste Runde, Zustand 3, 3 wird ausgewählt,

nächste Runde, Zustand 4, das bedeutet hier das Ende der Auswahl, act enthält 1, 2, 3, eine erste gültige Kombination

Zustand wird nun nicht mehr erhöht, sondern auf 3 reduziert,

in der nächsten Runde haben wir nun erstmals einen der Auswahlzustände (1 bis 3),
bei dem act schon Werte enthält, Wert 3 wurde an Position 3 schon verwendet,
da es keine höheren Werte gibt ist hier schon Schluss, es geht zurück Zustand 2,

(*)
in Zustand 2 (nächster Schleifendurchlauf) sagt act, dass zuletzt die 2 für diese Postition ausgewählt war,
nun ist ja noch die 3 möglich, aber nur, wenn nicht die 3 schon an Position 1 steht,
dafür haben wir auch das act-Array, das versichert uns, dass die 3 aktuell noch nicht gewählt wurde (Zustand 3 wurde inzwischen ganz gelöscht),
also wird nun Wert 3 an Position 2 geschrieben, act aktualisiert,
es geht weiter zu Zustand 3, dort wird die noch freie 2 ausgewählt,
Zustand 4, wieder 3 und wieder zu 2 zurück,

nun ist man wieder fast in der Situation (*) einen Absatz zuvor,
der Unterschied ist nur, dass das act-Array nun die Information enthält, dass für Position 2 schon der maximale Wert 3 verwendet wurde,
deshalb wird hier die Bearbeitung für Zustand 2 nicht fortgesetzt, es geht zurück zu 1,

usw.

wichtig ist noch, dass beim Zurücksetzen des Zustandes die act-Tabellen für die höheren Zustände ganz zurückgesetzt wird,

ich habe extra teilweise nur angedeutet, wie welche Informationen zu erhalten und abzufragen sind,
frage mich nicht nach noch mehr Details, das sollst schließlich du programmieren ;)
schon viel zu viel verraten

allerdings ist das auch ein sehr komplexes Verfahren, eigentlich zu schwer für so eine einfach klingende Aufgabe,

vielleicht gibts noch mehr Ideen

----------

eine noch von mir, diesmal nur ganz grob:

man fängt mit dem höchsten Element an, der 3 und bildet alle möglichen Kombinationen, also nur die eine mit 3 ;)

dann nimmt man die 2 dazu,
setzt die 2 vorne fest und verbindet sie mit allen bisherigen Kombinationen
-> 2 3

und dann nimmt man alle diese neuen Kombinationen und dreht sie durch
dadurch wird aus 2 3 auch zusätzlich 3 2,
'durchdrehen' heißt, das erste Element des Array wegzunehmen und hinten anzuhängen
das ist jetzt noch nicht deutlich, wird aber bald deutlicher,

jedenfalls erhält man 2 3 und 3 2


als nächstes kommt die 1, 1 vorne fest und mit allen bisherigen Kombos kombinieren
->
1 2 3
1 3 2

nun noch durchdrehen, aus 1 2 3 wird noch 2 3 1 und 3 1 2
aus 1 3 2 wird noch 3 2 1 sowie 2 1 3

macht insgesamt die 6 Kombinationen
 

nadoria

Mitglied
SlaterB hat gesagt.:
denkbar wäre eine Variante mit nur einer while-Schleife und mehreren Zustands-Hilfsvariablen + -Arrays, die quasi die Rekursion nachbauen,

wenn du die Rekursion noch nicht kennst, dann solltest du die zuerst ausprobieren, auch wenn du sie später nicht verwenden darfst (was diese Unlogik zeigt),
hilft beim Verständnis,

dann also eine große while(true)-Schleife,
ein Array (act) so groß wie k, in dem die aktuell verwendeten Elemente markiert werden,
eine int-Variable für den aktuellen Zustand

der Zustand ist anfangs 0 und wird pro Schleifendurchlauf um 1 erhöht,

im ersten Durchlauf also Zustand 1, das heißt dass es um das erste Element geht,
das act-Array zeigt an, dass noch alle Zahlen zur Auswahl stehen,
also wird jetzt das erste Element aus k für Position 1 ausgewählt
und dies in act vermerkt,

nächste Runde, Zustand 2, 2 wird ausgewählt,
nächste Runde, Zustand 3, 3 wird ausgewählt,

nächste Runde, Zustand 4, das bedeutet hier das Ende der Auswahl, act enthält 1, 2, 3, eine erste gültige Kombination

Zustand wird nun nicht mehr erhöht, sondern auf 3 reduziert,

in der nächsten Runde haben wir nun erstmals einen der Auswahlzustände (1 bis 3),
bei dem act schon Werte enthält, Wert 3 wurde an Position 3 schon verwendet,
da es keine höheren Werte gibt ist hier schon Schluss, es geht zurück Zustand 2,

(*)
in Zustand 2 (nächster Schleifendurchlauf) sagt act, dass zuletzt die 2 für diese Postition ausgewählt war,
nun ist ja noch die 3 möglich, aber nur, wenn nicht die 3 schon an Position 1 steht,
dafür haben wir auch das act-Array, das versichert uns, dass die 3 aktuell noch nicht gewählt wurde (Zustand 3 wurde inzwischen ganz gelöscht),
also wird nun Wert 3 an Position 2 geschrieben, act aktualisiert,
es geht weiter zu Zustand 3, dort wird die noch freie 2 ausgewählt,
Zustand 4, wieder 3 und wieder zu 2 zurück,

nun ist man wieder fast in der Situation (*) einen Absatz zuvor,
der Unterschied ist nur, dass das act-Array nun die Information enthält, dass für Position 2 schon der maximale Wert 3 verwendet wurde,
deshalb wird hier die Bearbeitung für Zustand 2 nicht fortgesetzt, es geht zurück zu 1,

usw.

wichtig ist noch, dass beim Zurücksetzen des Zustandes die act-Tabellen für die höheren Zustände ganz zurückgesetzt wird,

ich habe extra teilweise nur angedeutet, wie welche Informationen zu erhalten und abzufragen sind,
frage mich nicht nach noch mehr Details, das sollst schließlich du programmieren ;)
schon viel zu viel verraten

allerdings ist das auch ein sehr komplexes Verfahren, eigentlich zu schwer für so eine einfach klingende Aufgabe,

vielleicht gibts noch mehr Ideen

----------

eine noch von mir, diesmal nur ganz grob:

man fängt mit dem höchsten Element an, der 3 und bildet alle möglichen Kombinationen, also nur die eine mit 3 ;)

dann nimmt man die 2 dazu,
setzt die 2 vorne fest und verbindet sie mit allen bisherigen Kombinationen
-> 2 3

und dann nimmt man alle diese neuen Kombinationen und dreht sie durch
dadurch wird aus 2 3 auch zusätzlich 3 2,
'durchdrehen' heißt, das erste Element des Array wegzunehmen und hinten anzuhängen
das ist jetzt noch nicht deutlich, wird aber bald deutlicher,

jedenfalls erhält man 2 3 und 3 2


als nächstes kommt die 1, 1 vorne fest und mit allen bisherigen Kombos kombinieren
->
1 2 3
1 3 2

nun noch durchdrehen, aus 1 2 3 wird noch 2 3 1 und 3 1 2
aus 1 3 2 wird noch 3 2 1 sowie 2 1 3

macht insgesamt die 6 Kombinationen



Hallo SlaterB!

Vielen Dank für deine Antwort! (Hatte schon die Hoffnung aufgegeben, dass jemand ne Idee hat..)

Jetzt muss ich nur noch meine bescheidenen Java-Kenntnisse abrufen, um einen deiner Algorithmen zu realisieren :)

Gruß,

n.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Permutation, Verschlüsselung Java Basics - Anfänger-Themen 19
S Permutation Java Basics - Anfänger-Themen 6
S Methoden Effiziente Permutation? Guter Permutationsalgorithmus? Java Basics - Anfänger-Themen 1
N String permutation Java Basics - Anfänger-Themen 2
P Permutation Java Basics - Anfänger-Themen 7
S Überprüfen auf Permutation Java Basics - Anfänger-Themen 4
tanja Klasse Permutation Java Basics - Anfänger-Themen 3
S Permutation Rekusiv Java Basics - Anfänger-Themen 5
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
P 2n Potenzieren ohne Math.pow oder pow Java Basics - Anfänger-Themen 8
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
JavaBeginner22 TextArea, ohne Zeilenumbruch? Java Basics - Anfänger-Themen 4
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
M for schleife ohne geschweifte Klammer Java Basics - Anfänger-Themen 15
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Sinan Arrays auflisten ohne Wiederholung Java Basics - Anfänger-Themen 28
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
S Teilen ohne Rest Java Basics - Anfänger-Themen 15
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
P Methode trim() ohne StringBuilder Java Basics - Anfänger-Themen 1
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
S Klassenmethode ohne static Java Basics - Anfänger-Themen 2
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
M Bubblesort ohne Array Java Basics - Anfänger-Themen 30
J Array vertauschen ohne ein neues anzulegen?! Java Basics - Anfänger-Themen 10
F Hilfe - Wahrheitswert überprüfen ohne If Java Basics - Anfänger-Themen 2
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
C Teilbarkeit ohne "if" Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
R for schleife ohne klammer Java Basics - Anfänger-Themen 14
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
B Potenzrechnung mit WindowBuilder ohne math.pow() Java Basics - Anfänger-Themen 1
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
D .txt überschreiben mit BufferedWriter ohne reset Java Basics - Anfänger-Themen 6
H Cäsar chiffrierung ohne if-Anweisung Java Basics - Anfänger-Themen 5
A Input/Output System.out Ausgabe aktualisieren, ohne Konsole vollzuspamen Java Basics - Anfänger-Themen 2
B Potenzen ohne Math.pow Java Basics - Anfänger-Themen 4
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
M Liste ohne Duplikate Java Basics - Anfänger-Themen 8
S Rekursiver InsertionSort ohne Schleife Java Basics - Anfänger-Themen 7
4 Median ohne Array Rausbekommen Java Basics - Anfänger-Themen 8
L Auf Methoden einer Subklasse zugreifen ohne Typecast ? Java Basics - Anfänger-Themen 6
5 for-Schleife ohne 3 Angaben Java Basics - Anfänger-Themen 2
D Sortiertes Array mischen ohne Duplikat Java Basics - Anfänger-Themen 5
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
P JavaFX ohne FXMLLoader Java Basics - Anfänger-Themen 3
J Erstellen einer Datei ohne path Java Basics - Anfänger-Themen 1
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben