Alle möglichen kombinationen eines strings?



  • @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