NG Programmiersprache?
-
volkard schrieb:
Mr. N schrieb:
Nein, man muss nicht alles mit Rekursion erledigen, in der Tat will man das auch nicht, da Rekursion sehr wenig abstrakt ist.
Das gefällt mir auf der humoresken Ebene. Ich nehme es gleich mal in meine Sig auf.
Ich hab darüber dann gestern noch mit denis (Dr. Greenthumb) diskutiert... Nehmen wir z.B. die Summenfunktion, diesmal zur Abwechslung in Scheme.
Vergleiche die rekursive Version
(define (sum xs) (if (null? xs) 0 (+ (car xs) (sum (cdr xs)))))
mit der Higher-order function-Version
(define (sum xs) (fold-left + 0 xs))
Welche ist abstrakter?
-
Es gibt gute Abstraktion und böse Abstraktion. Du bis zur dunklen Seite der Macht gewechselt, fürchte ich.
-
Je mehr die Leute Sprachen studieren, statt sie praktisch einzusetzen, desto realitätsfremder werden sie anscheinend.
-
volkard schrieb:
Es gibt gute Abstraktion und böse Abstraktion. Du bis zur dunklen Seite der Macht gewechselt, fürchte ich.
Dann gibt es wohl mehrere dunkle Seiten, ich dachte immer, das hier sei die dunkle Seite der Macht: http://www.springsource.org/
Im Ernst, was ist "gute" und was ist "böse" Abstraktion? Das musst du mir erläutern, fürchte ich.
-
Das mit Spring musst du mir jetzt aber erklären, habe gerade ein Projekt mit Spring hinter mir und kann es bis jetzt nur empfehlen. Wobei hier auch weit nicht alle Teile des Frameworks eingesetzt wurden.
MfG SideWinder
-
SideWinder schrieb:
Das mit Spring musst du mir jetzt aber erklären, habe gerade ein Projekt mit Spring hinter mir und kann es bis jetzt nur empfehlen. Wobei hier auch weit nicht alle Teile des Frameworks eingesetzt wurden.
http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12
-
Mr. N schrieb:
Im Ernst, was ist "gute" und was ist "böse" Abstraktion? Das musst du mir erläutern, fürchte ich.
Ich bevorzuge da Sachen, die weniger abstrakt als Rekursion sind.
summe=0 foreach i in xs summe+=i
Manchmal (besonders wenn man Hochschulprofessor ist) baut man auch mal was rekursiv.
fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2)
Gute Abstraktion. Jetzt steht das Zeug auch recht hübsch und übersichtlich da.
Aber dann kommt einer, dem ist das doch nicht abstrakt genug, denn man kann ja noch fast den erzeugten Code erahnen, und er baut
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Böse Abstraktion.
-
Ein kleiner Überblick über Nano:
Die EBNF-Spezifikation:
-
volkard schrieb:
Manchmal (besonders wenn man Hochschulprofessor ist) baut man auch mal was rekursiv.
fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2)
Gute Abstraktion. Jetzt steht das Zeug auch recht hübsch und übersichtlich da.
Aber dann kommt einer, dem ist das doch nicht abstrakt genug, denn man kann ja noch fast den erzeugten Code erahnen, und er baut
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Böse Abstraktion.
Das zweite ist natürlich performanter, wenn man die ganze Liste will.
Wobei ich - bitte nicht glauben, dass ich den Code hübsch fände - da noch eins draufsetzen kann:
fix $ ([0,1] ++) . (zipWith (+) <*> tail)
-
Zeus schrieb:
@SideWinder
Ein kleiner Überblick über Nano:
[...]Vielen Dank, hast du die Zusammenfassung extra für mich gemacht oder erst gestern ins Repository hochgeladen?
Bin von einigen Dingen begeistert, aber bspw. die Begrenzung auf Rekursion als einzig iteratives Element will ich nicht wahrhaben
MfG SideWinder
-
Mr. N schrieb:
volkard schrieb:
Manchmal (besonders wenn man Hochschulprofessor ist) baut man auch mal was rekursiv.
fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2)
Gute Abstraktion. Jetzt steht das Zeug auch recht hübsch und übersichtlich da.
Aber dann kommt einer, dem ist das doch nicht abstrakt genug, denn man kann ja noch fast den erzeugten Code erahnen, und er baut
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Böse Abstraktion.
Das zweite ist natürlich performanter, wenn man die ganze Liste will.
Warum soll das performanter sein?
-
SideWinder schrieb:
Vielen Dank, hast du die Zusammenfassung extra für mich gemacht oder erst gestern ins Repository hochgeladen?
Ich hab sie auf Anfrage für dich und alle Lauscher gemacht
SideWinder schrieb:
Bin von einigen Dingen begeistert, aber bspw. die Begrenzung auf Rekursion als einzig iteratives Element will ich nicht wahrhaben
MfG SideWinderYo mal sehen
-
nachfrager schrieb:
Warum soll das performanter sein?
Weil die Fibonacci-Zahlen nicht immer wieder berechnet werden. Wenn du fib 4 rekursiv berechnest, berechnest du fib 1, fib 2, fib 3 und fib 4 immer auch (bei der naiven Rekursion sogar teilweise mehrfach). Bei der rekursiven Liste von volkard werden die Zahlen nur einmal berechnet und wiederverwendet.
-
Wenn ich blos den "Rekursionsschritt"? bei der Version erkennen würde
-
Also baue ich mir zuerst Schlösser mit 5 Stockwerken der Abstraktion und muß dann doch selber die Abstraktion bis runter auf sagen wir mal C-Niveau auflösen und mir vorstellen, wie er es innendrin macht, damit ich nicht in eine Falle tapse, und eine sehr langsame Funktion baue. Uih, das würde mich aber ein bißchen nerven.
-
Mr. N schrieb:
nachfrager schrieb:
Warum soll das performanter sein?
Weil die Fibonacci-Zahlen nicht immer wieder berechnet werden. Wenn du fib 4 rekursiv berechnest, berechnest du fib 1, fib 2, fib 3 und fib 4 immer auch (bei der naiven Rekursion sogar teilweise mehrfach). Bei der rekursiven Liste von volkard werden die Zahlen nur einmal berechnet und wiederverwendet.
Da nehme ich dann doch lieber eine for-schleife.
-
hehe schrieb:
Da nehme ich dann doch lieber eine for-schleife.
Dann zeig deine Künste.
-
Mr. N schrieb:
hehe schrieb:
Da nehme ich dann doch lieber eine for-schleife.
Dann zeig deine Künste.
Uninstressant, die For-Schleife für Fibonacci steht bei Stackoverflow. Hab ich gemerkt nachdem ich meine implementiert habe *gg*.
-
Zeus schrieb:
Mr. N schrieb:
hehe schrieb:
Da nehme ich dann doch lieber eine for-schleife.
Dann zeig deine Künste.
Uninstressant, die For-Schleife für Fibonacci steht bei Stackoverflow. Hab ich gemerkt nachdem ich meine implementiert habe *gg*.
Dann könnte man vergleichen, welche Methode komplizierter ist.
-
http://stackoverflow.com/questions/1518726/recursive-fibonacci
int fib(int n) { int a = 1, b = 1; for (int i = 3; i <= n; i++) { int c = a + b; a = b; b = c; } return b; }
Auf die iterative Version bin ich nur darauf gekommen, weil ich es in Tabellenform auf Papier gebracht habe.