Alle möglichen kombinationen eines strings?



  • hallo, nur nebenbei: ist unter dem stichwort
    "permutation"
    gut zu finden.



  • elise,

    elise schrieb:

    hallo, nur nebenbei: ist unter dem stichwort
    "permutation"
    gut zu finden.

    bei Permutationen sind keine Wiederholungen erlaubt. Ich schätze, wir reden hier von Variationen mit Wiederholung.

    Und zum Thema Rekursion allgemein: Rekursive Lösungen lassen sich häufig eleganter programmieren. Wenn jedoch eine halbwegs überschaubare iterative Lösung existiert, ist diese oft performanter bzw. verbraucht weniger Ressourcen.
    Also wenn es schnell gehen muß, würde ich persönlich immer die iterative Variante vorziehen.



  • dschensky schrieb:

    bei Permutationen sind keine Wiederholungen erlaubt. Ich schätze, wir reden hier von Variationen mit Wiederholung.

    Und zum Thema Rekursion allgemein: Rekursive Lösungen lassen sich häufig eleganter programmieren. Wenn jedoch eine halbwegs überschaubare iterative Lösung existiert, ist diese oft performanter bzw. verbraucht weniger Ressourcen.
    Also wenn es schnell gehen muß, würde ich persönlich immer die iterative Variante vorziehen.

    nach dem eingangsbeispiel würde ich sagen: nein, ohne wiederholung.
    aber muss der mensch ja selber wissen.
    mir ist nach langer einfindung die rekusive machmal einfacher.. kommt aber klar immer auf das problem an, und was sich "denktechnisch" anbietet.



  • @windoof
    funktioniert super! danke 👍



  • und wie muss ich die funktion abwandeln, wenn ich die werte alle "nacheinander" ein eine listbox einfügen will?
    d.h.:
    immer wenn eine neue kombination errechnet ist -> sofort in listbox, und nicht erst warten bis alle kombinationen errechnet sind und dann in die listbox



  • //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    { AnsiString Variante="";
      Memo1->Clear();
      Rekursion(Edit1->Text,Edit1->Text.Length(),Variante);
    }
    //---------------------------------------------------------------------------
    //Rekursive procedure !!!
    //Parameter VARIANTE muss Call by Referenz übergeben werden !!!
    void __fastcall TForm1::Rekursion(AnsiString Satz, int Rek, AnsiString &Variante)
    { if (Rek>0)
      { Rek--;
        for (int i=1;i<=Satz.Length();i++)
        { if (Rek>0)
            Rekursion(Satz,Rek,Variante+Satz[i]);
          else
            Memo1->Lines->Add(Variante+Satz[i]);
     }}}
    //---------------------------------------------------------------------------
    

    Braucht ca 47 sec für "123456" !!!
    auf 1700er Pentium



  • Sehr schön. So ganz durchgestiegen bin ich noch nicht, aber trotdem: sehr schön!

    DerAltenburger schrieb:

    Braucht ca 47 sec für "123456" !!!

    Und ohne Ausgabe vermutlich keine Sekunde?
    btw: Das call by reference ist hier nicht nötig.



  • DerAltenburger schrieb:

    <Edit: Zitate auf das Notwendigste beschränken. Danke!>

    funktioniert wirklich super!
    jetzt hab ich noch ein problem:
    was mache ich wenn ich alle kombinationen barauche die zwischen 3 und 6 zeichen lang sind?



  • Dann gibst Du noch nen Parameter (int Min) mit.

    Die Ausgabe (in Memo) erfolgt erst bei Rek>= Min

    Anstelle der Laenge des Stringes ubergibst Du die gewünschte maximalzahl (sollte NICHT groesser sein als Laenge!!!)



  • nein falsch verstanden 😃 ich meine ich habe den String "abcdefghijklmnopqurstuwxyz"
    und min:3; max:4;

    ausgabe:
    aaa
    aab
    aac
    ...
    aba
    ...
    zza
    zzb
    ...
    zzz
    aaaa
    aaab
    aaac
    ...
    aaba
    ...
    zzza
    zzzb
    ...
    zzzz



  • Kannst du C++? Kannst die Funktion doch selbst so umbauen, dass erh alt nur 3 Zeichen ausgibt...



  • Konsti schrieb:

    nein falsch verstanden 😃 ...

    Joooo, Du meine Antwort!

    Wenn Du als Parameter Rek Deine maximalzahl anstelle der Stringlaenge uebergibst, rkursiert das ganze nur so oft!!! (Count- Down- Zaehler)

    Die Ausgabe machst Du nicht nur am Ende der Rekursion (else- Zweig), sondern schon wenn Variante Deine mindestlaenge hat!

    Voila 😉

    @Windoof
    Hast Du auch konstruktive Tips? Er will nicht NUR 3 Zeichen lange Ausgaben!!! 😉



  • jo du hast recht! (hab ich auch nicht bezweifelt 😃 ) thx!


Anmelden zum Antworten