Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich wünsche mir ein Javaprogramm, dass mir alle Kombinationsmöglichekeiten der Zahlen: 1, 2, 3 angibt
also:
123
132
213
231
312
321
falls ich den Code verstehe, möchte ich ihn dann auf die Zahlenreihe 1 bis 7 erweitern
Mit freundlichen Grüßen
Thomas Vorwerk
hier ist ein Java-Programm, das alle Permutationen der Zahlen 1, 2 und 3 generiert und ausgibt:
Code:
import java.util.ArrayList;
import java.util.List;
public class Permutations {
// Methode zur Berechnung der Permutationen
private static void generatePermutations(List<Integer> numbers, List<Integer> currentPermutation, List<List<Integer>> result) {
if (numbers.isEmpty()) {
result.add(new ArrayList<>(currentPermutation));
} else {
for (int i = 0; i < numbers.size(); i++) {
List<Integer> remaining = new ArrayList<>(numbers);
Integer removed = remaining.remove(i);
currentPermutation.add(removed);
generatePermutations(remaining, currentPermutation, result);
currentPermutation.remove(currentPermutation.size() - 1);
}
}
}
// Methode zum Starten der Berechnung und Ausgabe der Permutationen
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3);
List<List<Integer>> result = new ArrayList<>();
generatePermutations(numbers, new ArrayList<>(), result);
for (List<Integer> permutation : result) {
System.out.println(permutation);
}
}
}
Erklärung des Codes:
Die generatePermutations Methode nimmt eine Liste von Zahlen (numbers), die aktuelle Permutation (currentPermutation), und eine Ergebnisliste (result) entgegen.
Wenn die Liste numbers leer ist, bedeutet dies, dass wir eine vollständige Permutation gefunden haben, die wir zur Ergebnisliste hinzufügen.
Andernfalls iteriert der Code durch die Zahlenliste, entfernt das aktuelle Element und ruft sich rekursiv mit der verbleibenden Liste auf.
Die main Methode initialisiert die Zahlenliste (in diesem Fall die Zahlen 1, 2 und 3) und startet den Permutationsprozess.
Um das Programm für die Zahlenreihe 1 bis 7 zu erweitern, ändern Sie einfach die Initialisierung der numbers Liste in der main Methode:
Code:
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> result = new ArrayList<>();
generatePermutations(numbers, new ArrayList<>(), result);
for (List<Integer> permutation : result) {
System.out.println(permutation);
}
}
Bitte beachten Sie, dass die Berechnung der Permutationen für größere Zahlenmengen sehr rechenintensiv ist. Für die Zahlen 1 bis 7 gibt es 7! (7 Fakultät) = 5040 Permutationen, was das Programm erheblich verlangsamen kann und eine erhebliche Menge an Speicher benötigt.
Wenn Sie noch Fragen haben oder weitere Anpassungen benötigen, lassen Sie es mich wissen.
Also eine ChaptGPT Lösung hin zu werfen, finde ich weniger gut. Die Frage ist doch, wie man man da von Hand vorgehen würde. Und da sehe ich mehrere Ansätze.
Der erste Ansatz, den man evtl. durchspielen könnte, ist das, was ich einen brute Force Ansatz nennen würde: Ich probiere einfach alles aus und prüfe, ob es zulässig ist. Das ist bei wenig Elementen relativ einfach zu machen und sieht bei einer Permutation mit Ziellänge 3 einfach 3 verschachtelte for Schleifen. Also etwas wie:
Java:
List<Character> chars = List.of('a', 'b', 'c' );
for (char ch1 : chars) {
for (char ch2 : chars) {
if (ch1 == ch2) continue;
for (char ch3 : chars) {
if (ch1 == ch3 || ch2 == ch3) continue;
System.out.println("" + ch1 + ch2 + ch3);
}
}
}
Wenn man das erweitern will auf beliebige Anzahl Zeichen / beliebige Länge, dann wird es aber schwer. Denn mit jedem Zeichen brauche ich eine for Schleife.
Also schaue ich mir an, was da im code gemacht wird und das immer das gleiche:
Es wird immer jedes Element genommen und dann ausprobiert. Das kriegt man also auch entsprechend Rekursiv hin.
Dann stellt man fest: Es ist blöd, dass man immer prüfen muss, ob ein Zeichen schon verwendet wurde. Aber man könnte ja das gerade verwendete Zeichen immer heraus nehmen, den Aufruf machen und dann wieder hinzu fügen. (Oder man macht eine Kopie - wie im ChatGPT Code).
Und dann braucht man bei jeder Rekursion ein Abbruchkriterium. Wenn keine Zeichen mehr da sind wäre halt ein mögliches Abbruchkriterium.
==> Algorithmus von ChatGPT erarbeitet - war das jetzt so schwer?
Aber es bleibt noch ein weiterer Ansatz:
Man kann sich aber auch einfach überlegen: Was genau mache ich denn? Ich gehe ja hin und tausche Elemente.
Also aus "123" mache ich ein "213". Und dann muss ich überlegen, wie ich tauschen muss. Das ist aber relativ abstrakt wobei es da auch gute Hilfen gibt (Siege verlinkten Wikipedia Artikel).
Das ist nicht mehr intuitiv (finde ich), aber es ist das, was Mathematiker oder so halt machen würden. Und siehe da: Ein Herr B. R. Heap hat das einmal 1963 gemacht und dabei ist der Heap Algorithmus heraus gekommen. Heap-Algorithmus – Wikipedia
Also ganz ohne ChatGPT ist das doch alles machbar ...
Sorry, der TO hat einen anfänglichen Text so verfasst, dass ich (provokativ) mit Chat-GPT geantwortet habe. Finde es aber weder Unsinnig noch Sinnvoll unter verschiedenen Aspekten.
e.g. "Ich wünsche mir..." deutet darauf hin, dass man nicht bereit ist es zu lernen, sondern es haben will.?
Das ist verständlich und ich kann die Beweggründe verstehen aber dennoch finde ich so Antworten nicht gut. Aber da spreche ich nicht als Moderator sondern drücke nur meine Meinung etwas aus.