【发布时间】:2018-11-29 01:32:39
【问题描述】:
我尝试使用 y-combinator(在 Lua 和 Clojure 中),因为我认为这可以让我在使用递归时超出默认堆栈实现的大小。看来我弄错了。是的,它可以工作,但是在这两个系统中,堆栈的爆炸点与使用普通的旧递归完全相同。 Clojure 中的低 ~3600 和我的 Android Lua 实现中的高 ~333000。它也比常规递归慢一些。
那么使用 y-combinator 有什么好处,或者它只是为了证明一个观点而进行的智力练习?我错过了什么吗?
===
PS。抱歉,我应该更清楚地说明我知道我可以使用 TCO 来超过堆栈。我的问题与此无关。我对此感兴趣 a) 从学术/知识的角度来看 b) 对于那些不能写成尾部递归的函数,是否有什么可以做的。
【问题讨论】:
-
Lua 支持尾调用优化。如果您可以将递归重写为尾调用,则您将不再受堆栈大小的限制。
-
谢谢亨利。我知道 Lua 支持 TCO,因为我经常使用它。 Clojure 也是如此,通过'recur'。我的问题涉及那些 / 不能 / 以尾递归方式编写的函数;还有 y-combinator 的任何实际用途。
标签: recursion lua clojure y-combinator fixpoint-combinators