fibonacci上的U combinator:您如何将此代码转换为python?

fibonacci上的U combinator:您如何将此代码转换为python?,python,code-translation,fixpoint-combinators,Python,Code Translation,Fixpoint Combinators,我正在努力学习组合子,但在理解()中给出的示例时遇到了困难。我想我已经开始理解这个概念了,但我还远远没有理解 我想将以下代码翻译成Python: (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) ;==

我正在努力学习组合子,但在理解()中给出的示例时遇到了困难。我想我已经开始理解这个概念了,但我还远远没有理解

我想将以下代码翻译成Python:

     (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
(定义(U f)(f))
(定义(fib或f)
(λ(n)
(如果(14930352
我试着用“直译”的方式来翻译:

U = lambda u: u(u)

def fibnr(f):
    return lambda n:  1 if (n<2) else (f (f (n-1))) + (f (f (n-2)))
U=lambda U:U(U)
def纤维(f):

返回lambda n:1,如果(n我写了一个简单的翻译,似乎产生了正确的结果:

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
def U(f):返回f(f)
def纤维(f):
林德辉(北):
如果(n<2):返回1
返回f(f)(n-1)+f(f)(n-2)
返回林
或者如果你真的喜欢lambdas:

def fibnr(f): return lambda n: 1 if (n < 2) else f(f)(n-1) + f(f)(n-2)
def fibnr(f):如果(n<2)其他f(f)(n-1)+f(f)(n-2),则返回lambda n:1
我认为您最初的问题是将Lisp
((f)x)
翻译成Python
f(f(x))
而不是
f(f)(x)


祝你好运理解combinators:)

是的,你完全正确!我以为这和((f)x)有关,但我不确定是什么。我把代码改成了f(f)(x),它就成功了。我用了大约1分钟的时间从python解释器计算U(fibnr)(35)。
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
def fibnr(f): return lambda n: 1 if (n < 2) else f(f)(n-1) + f(f)(n-2)