Aber in der wenn man so will
1. "Brute-Force" Variante nimmt man den Heap-Algorithmus (beste/schnellste Variante) und
2. verwendet die sich daraus ergebende Reihenfolge und
3. lässt diesen bis zum gewünschten Index durchlaufen.
4. Das entspricht dann zwar nicht der von PN/DP im 1.Post geforderten Reihenfolge, aber es ergibt sich wenigstens ein einigermaßen eleganter Code.
Zu 1.:
Grunsätzlich: warum nicht?
Zu 2.:
Wenn's denn die geforderte Reihenfolge wäre: OK.
Zu 3.:
Durchlaufen? Das bedeutet aber, ich muss alle Permutationen beginnend mit dem Index 1 bis zum vorgegebenen Index i nacheinander ausführen, um das gesuchte Ergebnis zu erhalten!
Kann man machen. Kann man sich aber auch ersparen, indem man aus dem vorgegebenen Index i direkt die i-te Permutation berechnet, was bei der durch die Aufagbenstellung vorgegebene Reihenfolge der Permutationen (aufsteigend) durchaus möglich ist.
Zu 4. (und 1.):
Du willst also die Aufgabenstellung so umdefinieren, dass man den elegantesten Code verwenden kann, der dafür aber i-mal (von 1 bis i) durchlaufen werden muss, um die Lösung zum vorgegebenen Index i zu liefern.
Du hast Recht, Thomas. Das empfinde ich tatsächlich als "brute force".
Das einzige was ich bisher aus diesen Thread sinnvoll mitgenommen habe ist, dass VBA noch schlimmer ist als Perl, und ich habe schon einiges in Perl programmiert.
Ein abschreckendes Beispiel, programmiert in der Sprache A, zu nehmen und es mit einem sauberen Beispiel, programmiert in der Sprache B, zu vergleichen, das dürfte eigentlich immer dazu führen, dass die ProgrammierSprache A als VizeSieger aus dem Wettbewerb hervorgeht.
Dein Satz sagt eigentlich nichts über die beiden genannten ProgrammierSprachen aus, sondern nur, dass Dir meine Denkweise oder *) mein ProgrammierStil nicht gefallen.
Das hättest Du auch ganz direkt sagen können!
Mein "Algorithmus" arbeitet auch mit Iteration. Aber die Anzahl der SchleifenDurchläufe (nämlich n-1) ist einzig durch die Anzahl n der zu permutierenden Zeichen vorgegeben.
1. Durchlauf berechnet die 1. Stelle des Ergebnisses
2. Durchlauf berechnet die 2. Stelle des Ergebnisses
u.s.w. bis
n-1 berechnet die vorletzte Stelle des Ergebnisses, wodurch dann zwangsläufig auch die letzte Stelle schon ermittelt ist.
Im Fall dieses Threads (4 Zeichen) also immer "bescheidene" 3 SchleifenDurchläufe (unabhängig vom Index).
Ein Teil des Aufwandes ergibt sich dadurch, dass der Index 1..24 sein soll statt der "eleganteren" 0..23.
Ein weiterer Teil des Aufwandes ergibt sich daraus, dass ich die Aufgabenstellung verallgemeinert habe (z.B. Onkel Dagobert hatte sich Flexibilität in der Stellenzahl gewünscht): die verwendeten Zeichen beschränken sich nicht mehr auf 1..n, sondern dürfen n beliebige Zeichen sein (Ziffern, GrossBuchstaben, KleinBuchstaben, Sonderzeichen, das alles beliebig durcheinander gemischt, jedoch maximal n=9 Zeichen).
Und nicht zuletzt, vor der eigentlichen Berechnung werden die beiden AufrufParameter der Funktion geprüft.
- Ist die Anzahl der verwendeten bzw. zu verwendenden Zeichen zulässig (n=2..9)?
- Enthält die vorgegebene Liste der zu verwendenden bzw. der verwendeten Zeichen unzulässige Wiederholungen?
- (Nur bei 'Berechnung der Permutation aus dem Index') Ist der vorgegebene Index bei der gewählten Anzahl Zeichen zulässig?
- (Nur bei 'Berechnung des Index aus der Permutation') Passt die vorgegebene Permutation bezüglich des Zeichensatzes zur vorgegebenen Liste der verwendeten Zeichen?
Ein schönes RWE **) wünscht
Heinileini
*) : inklusives(!) Oder.
**) : Nein, nicht RotWeissEssen und auch nicht RheinischWestfälischeElektrizitätswerke, sondern RestWochenEnde.