Schreiben Sie einen Festkomma-Kombinator in möglichst wenigen Zeichen in der Sprache Ihrer Wahl.
- freie Form ( dh was auch immer am kürzesten ist): gesamtes Programm, tatsächliche Funktion, Code-Snippet
- Sie dürfen Ihre Standardbibliotheken nicht verwenden, wenn sie eine haben
- Sie können es jedoch aus anderen übergeordneten Funktionen extrahieren, wenn Sie dies lieber tun, als es aus den Basen zu konstruieren
Bitte fügen Sie eine rekursive Fakultät oder Fibonacci hinzu, die sie als Demo verwendet.
In dieser Frage ist eine Selbstreferenz akzeptabel. Das Ziel besteht ausschließlich darin, sie aus der rekursiven Funktion zu entfernen, für die sie gelten wird.
(define Y(lambda(f)(f(Y f))))
?)Antworten:
Haskell: 10 Zeichen
Anwendungsbeispiel zum Erstellen rekursiver Definitionen von Fakultäts- oder n-ten Fibonacci:
Eine gebräuchlichere Methode
y
wäre jedoch, diese Sequenzen direkt und nicht als Funktionen zu generieren:Bei Haskell ist das natürlich ein bisschen so, als würde man Fische in einem Fass schießen! Die
Data.Function
Bibliothek hat diese Funktion, die aufgerufen wirdfix
, obwohl sie etwas ausführlicher implementiert ist.quelle
Perl, 37
Faktorielle Demonstration:
Fibonacci-Demonstration:
quelle
GNU C - 89 Zeichen
Beispiel:
quelle
k2, 12 char
Die offensichtliche selbstreferenzielle Implementierung ist die kürzeste. Dies ist ein Zeichen für gutes Sprachdesign. Leider ist K nicht faul, so dass wir Call-by-Value nur verwalten können.
Diese Definition sollte auch in k4 und q problemlos funktionieren, obwohl ich für die folgenden Beispiele k2 annehme.
Mit bescheideneren 18 Zeichen können wir genau
(λx. x x) (λxyz. y (x x y) z)
in K transkribieren .Vielleicht könnte das eines Tages (k7?) So aussehen
Y:{x Y x}
.quelle
Python 3, 30 Bytes
Demo:
Credits: https://gist.github.com/WoLpH/17552c9508753044e44f
quelle