Quersumme einer Zahl



  • Kellerautomat schrieb:

    Ich finde ?: schoener, schon alleine der Symmetrie wegen.

    Schöner, und besser Lesbar? Wie stehts damit?



  • JA!


  • Mod

    Sone schrieb:

    Kellerautomat schrieb:

    Ich finde ?: schoener, schon alleine der Symmetrie wegen.

    Schöner, und besser Lesbar? Wie stehts damit?

    Das auch.



  • Sone schrieb:

    return (z?z%10+quer(z/10):0);
    

    Du bist ein Drei-Sterne Programmierer.

    if(z)
        return z % 10 + quer( z / 10 );
    
    return 0;
    

    Ah ok ja das ist auch nicht schlecht. 🙄

    return (z?z%10+quer(z/10):0);

    Auch wenn Geschmacksache ist mir die Optimierung der Schreibweise nicht wichtig. Ich finde diese sowieso unübersichtlich schwerer im Debugger zu verfolgen.
    Da muss man schon sehr genau schauen was da los ist.
    Die Idee dahinter hab ich erst verstanden als ich das wieder aufgetrennt hatte. Und da hat dann schon Sone gepostet.



  • 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