Diese Rekursion...



  • Dave01 schrieb:

    void Filter(), welche jedes Sonderzeichen rauslöscht

    Die Funktion funktioniert ja so schon nicht 😃
    Mal probiert einfach "-----" einzugeben?^^
    Die Funktion könnte so aussehen:

    void Filter(char *s)
    {
      while (*s)
      {
        if (!isalpha(*s))
          memmove(s, s + 1, strlen(s));
        else
          ++s;
      }
    }
    

    Jetzt schreib du sie rekursiv. Ja, es geht und es ist auch nicht sonderlich schwer 😉



  • @cookie: Bist du sicher, daß diese Konstruktion mit memmove() und strlen() wirklich die beste (schnellste) Lösung ist? Ich hätte die einzelnen Einträge zeichenweise zusammengeschoben:

    void Filter(char *s)
    {
      char* t = s;
      for(;*s;++s)
      {
        if (isalpha(*s))
          *t++ = *s
      }
      *t='\0';
    }
    

    (oder in C++ per remove_if())



  • CStoll schrieb:

    die beste (schnellste) Lösung ist?

    Ne, hatte nur schnell etwas zweckmäßiges gebastelt, deine Lösung ist besser 😉



  • Tut mir leid, mit isalpha..memmove fang ich leider nicht sehr viel an, da ich noch nicht die Funktionen verwendet hatte.
    Bei der Funktion Filter geht es nur drum aus einem Wort "Re123iTTiE!r" die Sonderzeichen zu löschen und bei mir funktioniert das eig. ganz gut. Auf jeden Fall hab ich nun probiert die Funktion rekursiv zu schreiben und zu verstehen. So sieht das bei mir aus. Es funktioniert.. ist es aber richtig rekursiv programmiert? Bzw. was macht es für einen unterschied wenn ich eine Void funktion daraus mach und eben die funktion in der funktion aufrufe?

    int filter_rek(char *s, char *ptr)
    {
        if(*s == '\0')
        {
            *ptr='\0';
            return 1;
        }
        else
        {
            if((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z'))
            {
                *ptr=*s;
                ptr++;
            }
            return filterr(s+1,ptr);
        }
    }
    


  • Ja, das sieht rekursiv aus (wenn du noch die Namen korrekt hinbekommst :D) und sieht auf den ersten Blick auch korrekt aus. Das ganze als void-Funktion umzusetzen dürfte kein größeres Problem sein.
    Was du mit Schleife meinst, bin ich mir jetzt nicht sicher - du hast die Schleife ja durch den rekursiven Aufruf ersetzt.

    PS: isalpha() ist eine etwas kürzere Form, das selbe zu sagen wie bei deinen Bereichsvergleichen, memmove() verschiebt größere Blöcke im Speicher.

    PPS: Darf man erfahren, ob dieses rekursiv-Gebastel einen tieferen Sinn hat? Normalerweise ist eine iterative Version (Schleife) schneller und kompakter, deshalb geht man eher den Weg, rekursive Funktionen durch iterative zu ersetzen als umgekehrt.



  • Nur mal ein Beispiel aus meinem Umfeld: Es gibt Lehrer, die tierisch auf rekursion abfahren 😃



  • Ok wollte nur wissen ob man das ganze auch als void schreiben könnte.
    Das Rekursionsgebastel ist einfach vom Lehrer so vorgegeben worden. Wir üben das ganze indem wir ein paar Bsp. einfach auf die Rekursionsform umschreiben. Und das steht leider so im Lehrplan drinnen. Iterativ ist mir auf jeden Fall um einiges lieber (vielleicht aber auch nur weil ich es besser kann) 🙂



  • Dave01 schrieb:

    Ok wollte nur wissen ob man das ganze auch als void schreiben könnte.

    Wie schon gesagt: Ja das geht.

    Das Rekursionsgebastel ist einfach vom Lehrer so vorgegeben worden. Wir üben das ganze indem wir ein paar Bsp. einfach auf die Rekursionsform umschreiben. Und das steht leider so im Lehrplan drinnen. Iterativ ist mir auf jeden Fall um einiges lieber (vielleicht aber auch nur weil ich es besser kann) 🙂

    OK, das erklärt einiges.


Anmelden zum Antworten