Ausgabe in C
-
Ob Performance von Interesse ist, hängt stark davon ab, wie oft solche Umwandlungen geschehen sollen. So oder so ist aber die Vorstellung, dass 30 Funktionsaufrufe für die Umwandlung einer Ganzzahl in Binärnotation eine vernünftige Implementation wären, ziemlich albern.
Was die Schnittstelle angeht, die hat mit den Implementationsdetails hier ziemlich wenig zu tun. Den Code, mit dem man die gleiche Schnittstelle nachbilden kann, habe ich ja schon in den Kommentar geschrieben - auch mit memmove hinten drangehängt dürfte das allemal schneller sein als die Rekursion, und wenn du zusätzlich zur Rekursion noch einen Stack benutzen willst, mit ziemlicher Sicherheit auch übersichtlicher. Die Gruppierung in Nibbles hattest du übrigens auch nicht erschlagen, und das ist rekursiv auch nicht wirklich elegant zu machen. Oder?
-
seldon schrieb:
Ob Performance von Interesse ist, hängt stark davon ab, wie oft solche Umwandlungen geschehen sollen. So oder so ist aber die Vorstellung, dass 30 Funktionsaufrufe für die Umwandlung einer Ganzzahl in Binärnotation eine vernünftige Implementation wären, ziemlich albern.
Worauf willst du hinaus? Dass viele Sortier- und Suchalgorithmen albern sind? Dass Rekursion an sich albern ist? 30 Funktionsaufrufe sind nichts! Stackoverflow? Gar nicht möglich! Viel zu wenig Aufrufe!
auch mit memmove hinten drangehängt dürfte das allemal schneller sein als die Rekursion
Von wieviel Mikrosekunden redest du?!
und wenn du zusätzlich zur Rekursion noch einen Stack benutzen willst, mit ziemlicher Sicherheit auch übersichtlicher.
Was ist bei einem stack.add(x) unübersichtlich? Das vereinfacht sogar meine Implementierung nochmals!
Die Gruppierung in Nibbles hattest du übrigens auch nicht erschlagen, und das ist rekursiv auch nicht wirklich elegant zu machen. Oder?
Das ist Sache der Ausgabe, nicht der Eingabe.
L. G.
Steffo
-
Ich vermutet mal Seldon will darauf hinaus, dass Dein Lösungsansatz einem mit "Kanonen auf Spatzen schiessen" entspricht.
-
Shiba schrieb:
Ich vermutet mal Seldon will darauf hinaus, dass Dein Lösungsansatz einem mit "Kanonen auf Spatzen schiessen" entspricht.
Laser-Kanone, wenn schon denn schon.
Mal was anderes:
Kann es sein, dass diese Webseite ziemlicher Mist ist?
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html#ungetcHier wird erstens nicht erwähnt, wie von Seldon behauptet, dass ungetc nur maximal ein einmaliges Zeicheneinlesen garantiert und danach ggf. die Operation misslingt, zweitens wird hier behauptet, dass das Einlesen nach dem FIFO-Prinzip erfolgt. Folgender Code ist aber eindeutig LIFO!
ungetc('2', stdin); ungetc('1', stdin); printf("%c", getchar()); printf("%c\n", getchar()); /* Liefert 12 */
L. G.
Steffo
-
Du kannst nicht davon ausgehen, dass eine Funktion immer nur einmal aufgerufen wird. Stackoverflow ist hier in der Tat kein Thema, aber dass ein Holzklotz nicht explodieren kann, heißt nicht, dass er einen passablen Fußball abgäbe. Es mag Anwendungsfälle geben, in denen eine verhältnismäßig langsame Implementation völlig ausreicht, aber guter Stil ist selbige dadurch trotzdem nicht.
Die Frage, ob die Anwendung eines Stacks deine Implementation vereinfacht, stellt sich im Grunde erst dann, wenn du eine hast. Bislang hast du ja nur diesen Haufen undefinierten Verhaltens. Allerdings: Einen Stack musst du implementieren und in der Gegend herumreichen, wie auch die Position, an der geschrieben werden soll. Mit einer Funktion kommst du da schon nicht mehr hin (was an sich nicht unbedingt problematisch wäre), wenn du die Schnittstelle erhalten willst, und dass die Hilfsfunktion einfacher wird als eine simple Schleife, daran habe ich meine Zweifel.
Aber ich lasse mich gern überraschen. Zeig mal her, wie du dir das vorstellst. Kleiner Tip übrigens: Achte darauf, dass du auch zurechtkommst, wenn dir mal eine 0 übergeben wird.
Re: ungetc: Ich habe aus dem ISO-Standard zitiert. Was der sagt, das gilt, völlig unabhängig von dem, was in irgendeiner Referenz aus dem Netz nicht erwähnt wird.
-
Der Standard sagt zu
ungtc()
, dass es einmal garantiert ist.
Es kann mehrmals funktionieren, muss es aber nicht.
-
seldon schrieb:
Du kannst nicht davon ausgehen, dass eine Funktion immer nur einmal aufgerufen wird. Stackoverflow ist hier in der Tat kein Thema, aber dass ein Holzklotz nicht explodieren kann, heißt nicht, dass er einen passablen Fußball abgäbe. Es mag Anwendungsfälle geben, in denen eine verhältnismäßig langsame Implementation völlig ausreicht, aber guter Stil ist selbige dadurch trotzdem nicht.
Ich finde den Stil ehrlich gesagt super (wenn man einen Stack nehmen würde) und um wieviel langsamer das ist, müsste man messen.
Einen Stack musst du implementieren
Das ist kein Problem, denn so ein Stack ist ja prinzipiell universell einsetzbar und deswegen schreibe ich hier keinen Stack für einen einzigen Anwendungsfall.
wie auch die Position, an der geschrieben werden soll.
Was für ne Position? Das kommt alles oben drauf mit der add-Funktion. Das ist ja das tolle am Stack - du brauchst keine Positionen mitangeben!
Aber ich lasse mich gern überraschen. Zeig mal her, wie du dir das vorstellst. Kleiner Tip übrigens: Achte darauf, dass du auch zurechtkommst, wenn dir mal eine 0 übergeben wird.
Sorry, würde ja gerne bei dem Contest mitmachen, muss aber Mathe lernen!
Kannst es ja selbst versuchen. Kleiner Tipp übrigens: Nicht so kompliziert denken.
Re: ungetc: Ich habe aus dem ISO-Standard zitiert. Was der sagt, das gilt, völlig unabhängig von dem, was in irgendeiner Referenz aus dem Netz nicht erwähnt wird.
Das ist nicht irgendeine Referenz aus dem Netz, sondern die "Association for Computing Machinery", die ich über einen Wikipedia-Link entdeckt habe! Aber offensichtlich schreiben die ziemlichen Mist!
L. G.
Steffo
-
*seufz*
Du musst einen Stack herumreichen, in dem die Bits umgekehrt liegen, und du musst eine Positionsangabe herumreichen, wo sie nachher hingeschrieben werden sollen. Bedenke: Du befindest dich, wenn du das vorderste Zeichen schreiben willst, in der innersten Rekursionsebene! Du musst in den äußeren jeweils wissen, wo das bisherige Ende des Strings ist.
Ferner musst du, um die Gruppierung zu erreichen, herumreichen, wann der nächste Trenner eingefügt werden muss. Das sind alles lösbare Probleme, aber die Rekursion macht es unnötig umständlich.
Insgesamt wäre eine Queue für einen rekursiven Ansatz wohl zielführender; beides ist aber völliger Overkill.
-
Jetzt weiß ich wenigstens warum meine installierten Java-Programme so langsam laufen. Der Sprache werde ich die Schuld jedenfalls nicht mehr zuschieben.
-
Man kann in jeder Sprache Fortran schreiben
Man kann in jeder Sprache langsame Programme schreiben.