aus schleifen eine rekursion erzeugen



  • hu

    Du erzählst das so locker 😃

    std::string temp = result + " ";
    

    -> Wozu das?

    cu



  • rulzi schrieb:

    hu

    Du erzählst das so locker 😃

    std::string temp = result + " ";
    

    -> Wozu das?

    cu

    Damit hab ich mir selbst widersprochen. Denn das war eine kleine Optimierung, um nicht in der Schleife jedesmal einen neuen std::string zu erzeugen. Am einfachsten wäre die Schleife mit:

    for (std::string::size_type i = 0; i != f.size(); ++i)
    {
      k(f, result + f[i], len-1);
    }
    


  • hi

    result + f[i]
    

    -> Es müsste doch result immer länger und länger werden..aber warum ist das nicht so?

    cu



  • rulzi schrieb:

    result + f[i]
    

    -> Es müsste doch result immer länger und länger werden..aber warum ist das nicht so?

    Hier wird result nicht verlängert. Es wird ein neuer temporärer String angelegt, der die Summe darstellt. Wenn du schreibst,

    int a = 2, b =3;
    a + b;
    

    wird weder a noch b verändert. Dagegen wird ein temporäres int mit der Summe erzeugt und gar nicht verwendet.

    Der string würde bei folgenden Operationen länger werden:

    result = result + f[i];
    result.append(f[i]);
    result += f[i];
    


  • hi

    Hm, ich arbeite sehr selten mit strings.
    Ich versuche gerade deine string variante mit feldern darzustellen, aber irgendwie wird das auch nix...

    char f[]="abc";
    char t[4]="";
    int laenge=0;
    void rek(char *f)
    {
        if(laenge>3)    
        {
            cout<<t<<endl;
            return;   
        }    
        for(int i = 0; i != strlen(f); ++i)
        {
            ++laenge;
            t[laenge]=f[i];
            rek(f);    
        }   
    }
    

    cu



  • Mal ohne strings:

    #include <string>
    #include <iostream>
    
    char const * f = "ab";
    char result[5];
    
    void k(char const * f, char * r,  int len)
    {
      if (len == 0) {
        std::cout << result << std::endl;
        return;
      }
    
      for (int i = 0; i != strlen(f); ++i)
      {
        *r = f[i];
        k(f, r + 1, len-1);
      }
    }
    
    int main()
    {
       result[4] = 0;
       k(f, result, 4);
    }
    


  • hu

    Wenn die Funktion aber nur einen Parameter hat?
    (wie bei mir es der Fall ist)- denn so würde ich es erstmal machen wollen - zum besseren verständnis.

    cu



  • rulzi schrieb:

    Wenn die Funktion aber nur einen Parameter hat?
    (wie bei mir es der Fall ist)- denn so würde ich es erstmal machen wollen - zum besseren verständnis.

    Du kannst um die Version mit Parametern, einen Wrapper mit nur einem Parameter schreiben.

    Dein Programm scheitert unter anderem daran, dass die Laenge kein Parameter sondern eine globale Variable ist. Man kann auch damit arbeiten, indem der Wert nach dem rekursiven Aufruf wieder zurückgesetzt wird, aber ein Parameter ist einfacher.



  • hi

    Könntest du mir das bitte mit nur einem Parameter ummodeln?
    Bitte 😕

    cu



  • rulzi schrieb:

    Könntest du mir das bitte mit nur einem Parameter ummodeln?

    Dazu muss man zuerst genau wissen, was du haben möchtest. Also, was ist die Eingabe und was ist die Ausgabe?



  • hu

    char f[]="abcdefghji";
    int LAENGE=strlen(f);
    k(char t[])
    {
    ...
    }
    

    cu



  • Was ist das t[]?



  • hi

    Also: der Funktion k wird das Zeichenfeld übergeben wo die ganzen Zeichen drin stehen mit denen alle möglichen kombinationen durchgeführt werden sollen. (hatte das in meinem vorhergehenden thread falsch dargestellt). 🙄

    cu



  • rulzi schrieb:

    Also: der Funktion k wird das Zeichenfeld übergeben wo die ganzen Zeichen drin stehen mit denen alle möglichen kombinationen durchgeführt werden sollen. (hatte das in meinem vorhergehenden thread falsch dargestellt). 🙄

    Welche Länge haben die Kombinationen? Man kann normalerweise die Länge beliebig wählen. Bei "ab" und der Länge 3 hat man:

    aaa
    aab
    aba
    abb
    baa
    bab
    bba
    bbb



  • hi

    Die Länge sollte als globale variable existieren.

    cu


Anmelden zum Antworten