U Kombinator auf einem Fibonacci: Wie würden Sie den Code zu Python übersetzen?
-
29-09-2019 - |
Frage
Ich versuche, über Kombinatoren zu lernen, und ich habe Probleme am Beispiel verstehen gegeben, bei ( Y zwingende Selbstanwendung ). Ich glaube, ich fange an, das Konzept zu begreifen, aber ich bin noch weit davon entfernt zu verstehen.
Ich möchte den folgenden Code in Python übersetzen:
(define (U f) (f f))
(define (fib-nr f)
(lambda (n)
(if (< n 2) 1 (+ ((f f) (- n 1)) ((f f) (- n 2))))))
# Usage:
((U fib-nr) 35) ;==> 14930352
Ich habe versucht, einen 'wörtlichen' Übersetzung durch Schreiben:
U = lambda u: u(u)
def fibnr(f):
return lambda n: 1 if (n<2) else (f (f (n-1))) + (f (f (n-2)))
Aber das funktioniert nicht (ich glaube, es mit dem zu tun, hat die Funktionen innerhalb der Lambda ausgewertet werden).
So habe ich versucht, Funktion Zusammensetzung zu verwenden, wie:
# http://code.activestate.com/recipes/52902-function-composition/
class compose:
'''compose functions. compose(f,g,x...)(y...) = f(g(y...),x...))'''
def __init__(self, f, g, *args, **kwargs):
self.f = f
self.g = g
self.pending = args[:]
self.kwargs = kwargs.copy()
def __call__(self, *args, **kwargs):
return self.f(self.g(*args, **kwargs), *self.pending, **self.kwargs)
U = lambda u: compose(u, u)
def fibnr(f):
ff = compose(f, f)
return lambda n: 1 if (n<2) else (ff (n-1)) + (ff (n-2))
Aber immer noch nicht funktioniert, wenn mein letzten Code-Snippet Aufruf ich eine Lambda zurück:
>>> U(fibnr)(35)
<function <lambda> at 0x01A1B6B0>
So ist es möglich, eine ‚wörtliche‘ Übersetzung des gegebenen Beispiels in Python zu schreiben? Wie könnte ich es tun?
Lösung
Ich schrieb eine einfache Übersetzung, die richtigen Ergebnisse zu produzieren scheint:
def U(f): return f(f)
def fibnr(f):
def lam(n):
if (n < 2): return 1
return f(f)(n-1) + f(f)(n-2)
return lam
Oder wenn Sie wirklich, wie Lambda-Ausdrücke:
def fibnr(f): return lambda n: 1 if (n < 2) else f(f)(n-1) + f(f)(n-2)
Ich denke, Ihr anfängliches Problem übersetzt Lisp ((f f) x)
in Python f(f(x))
statt f(f)(x)
.
Viel Glück Verständnis combinators:)