gpt4 book ai didi

python - 斐波那契上的 U 组合器 : how would you translate this code to python?

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:52 27 4
gpt4 key购买 nike

我正在尝试学习组合器,但我无法理解 ( Y overriding self-application) 中给出的示例。我想我开始掌握这个概念,但我离理解还很远。

我想将以下代码翻译成 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 = lambda u: u(u)

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

但这不起作用(我认为这与函数在 lambda 中求值的顺序有关)。

所以我尝试将函数组合用作:

# 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))

但仍然没有用,当调用我的最后一段代码时,我得到了一个 lambda:

>>> U(fibnr)(35)
<function <lambda> at 0x01A1B6B0>

那么,是否可以用 Python 编写给定示例的“直译”?我该怎么做?

最佳答案

我写了一个简单的翻译,似乎产生了正确的结果:

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

或者如果你真的喜欢 lambdas:

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

我认为您最初的问题是将 Lisp ((f f) x) 翻译成 Python f(f(x)) 而不是 f(f)( x).

祝你理解码合器好运:)

关于python - 斐波那契上的 U 组合器 : how would you translate this code to python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097142/

27 4 0