Quersumme einer Zahl



  • Eisflamme schrieb:

    Hallo,
    stell Dir doch zuerstmal die Frage: Wie kommst Du auf die letzte Zimmer. Hast Du da eine Idee?

    durch vergleich der zimmernummern 🤡
    btw. heißt es das zimmer http://www.duden.de/rechtschreibung/Zimmer
    scnr

    out schrieb:

    Sone schrieb:

    Btw, du bist ein Drei-Sterne Programmierer.

    An was machst du das aus? 😕

    von wieviel möglichen sternen?
    jedenfalls hast du dir mit

    if(z)
    

    einen rang < 3 sterne wohl verdient (logik n00b bonus) 😃



  • martin_zi schrieb:

    Vor allem wie am Anfang es geht ja um eine Lösung mittels Rekursion.

    Na gut...

    template<class CharIter> 
    int qsum(CharIter first, CharIter last)
    {
      if (first == last) return 0;
      unsigned char n = *first - '0';
      if (n > 9) throw std::runtime_error(std::string(&*first,1) + ": Keine Ziffer!"); 
      return n + qsum(++first, last); //da, Rekursion!
    }
    

    *SCNR* 😛


  • Mod

    pumuckl schrieb:

    martin_zi schrieb:

    Vor allem wie am Anfang es geht ja um eine Lösung mittels Rekursion.

    Na gut...

    template<class CharIter> 
    int qsum(CharIter first, CharIter last)
    {
      if (first == last) return 0;
      unsigned char n = *first - '0';
      if (n > 9) throw std::runtime_error(std::string(&*first,1) + ": Keine Ziffer!"); 
      return n + qsum(++first, last); //da, Rekursion!
    }
    

    *SCNR* 😛

    Dann doch lieber:

    template<class CharIter> 
    int qsum(CharIter first, CharIter last, bool recurse = false)
    {
      int q = 0;
      for(; first != last; ++first)
      {
        unsigned char n = *first - '0';
        if (n > 9) return -1; //keine Ziffer
        q += n;
      }
      if (recurse)
       qsum(first, last, false);
      return q;
    }
    

    Aufgabe erfüllt.



  • SeppJ schrieb:

    [...] Aufgabe erfüllt.

    Gna. *kopf->tisch* tut ja richtig weh 😉
    Wobei ich mich frage, ob bei inlining etc. meine rekursive Version nicht ähnlich performant sein müsste wie die for-Schleife - dank tail-recursion.


  • Mod

    Ja, aber das zeigt dem Lehrer nicht, dass seine Aufgabenstellung kein gutes Beispiel für Rekursion ist.



  • Ich finde es übrigens gemein, dass ihr so viel vorwegnehmt. Hätte er über meinen Post nachgedacht statt eure Lösungen zu lesen, hätte er weit mehr an Erfahrung gewonnen. :p



  • pumuckl schrieb:

    .

    template<class CharIter> 
    int qsum(CharIter first, CharIter last)
    {
      if (first == last) return 0;
      unsigned char n = *first - '0';
      if (n > 9) throw std::runtime_error(std::string(&*first,1) + ": Keine Ziffer!"); 
      return n + qsum(++first, last); //da, Rekursion!
    }
    

    Wie ist diese Funktion tail-recursiv? Ist der letzte Aufruf nicht operator+ und nicht qsum selbst?



  • pyhax schrieb:

    Wie ist diese Funktion tail-recursiv? Ist der letzte Aufruf nicht operator+ und nicht qsum selbst?

    Ja, da hast du Recht.



  • pyhax schrieb:

    Wie ist diese Funktion tail-recursiv? Ist der letzte Aufruf nicht operator+ und nicht qsum selbst?

    Sie kann aber einfach tail-recursiv umgeformt werden. Ob der Compiler das macht, ist eine andere Frage.



  • pyhax schrieb:

    Wie ist diese Funktion tail-recursiv? Ist der letzte Aufruf nicht operator+ und nicht qsum selbst?

    Mein Fehler, sorry. Dann eben so:

    template<class CharIter> 
    int qsum(CharIter first, CharIter last, int start = 0)
    {
      if (first == last) return start;
      unsigned char n = *first - '0';
      if (n > 9) throw std::runtime_error(std::string(&*first,1) + ": Keine Ziffer!"); 
      return qsum(++first, last, n+start); //da, Rekursion!
    }
    

Anmelden zum Antworten