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
scnrout 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 mitif(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*
-
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.
-
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! }