gpt4 book ai didi

python - 为什么不能像定义中那样实现定点组合器?

转载 作者:行者123 更新时间:2023-12-03 17:09:02 26 4
gpt4 key购买 nike

我正在尝试实现 Y 组合器 like in the definition by Curry .
此代码不起作用。它会导致无限递归。

F = (lambda f: (lambda x: (1 if x == 0 else (x * (f(x-1))))))    
Y = (
lambda f:
(lambda x: f(x(x)))
(lambda x: f(x(x)))
)
Y(F)(3)
但是,这个确实有效:
Y = (
lambda f:
(lambda x: f(
lambda v: x(x)(v)
))
(lambda x: f(
lambda v: x(x)(v)
))
)
Y(F)(3)
为什么第一个不起作用,而第二个起作用?

最佳答案

Python 急切地评估所有函数参数,这就是导致 Y 组合器无限递归的原因。如 linked Wikipedia article 中所述:

In a strict programming language the Y combinator will expand until stack overflow, or never halt in case of tail call optimization.


为了防止这种“急切”,可以替换直接函数调用 x(x)使用另一个 lambda 函数。隐藏在该 lambda 函数中可防止它直接求值。这就是您在第二个版本中所做的: lambda v: x(x)(v) .这种形式被称为 Z 组合器(参见上面的维基百科文章)。

关于python - 为什么不能像定义中那样实现定点组合器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67404522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com