Y组合器似乎没有任何作用

时间:2018-06-20 02:31:06

标签: recursion clojure lua fixed-point y-combinator

我尝试使用y-combinator(在Lua和Clojure中都使用),因为我认为使用递归时可以超出默认堆栈实现的大小。看来我弄错了。是的,它可以工作,但是在这两个系统中,堆栈的崩溃都与使用普通的旧递归完全相同。我的Android Lua实施中Clojure的最低价约为3600,而最高价约为333000。它也比常规递归要慢。

因此,使用y组合器有什么好处,还是证明这一点只是一种智力上的练习?我错过了什么吗?

===

PS。抱歉,我应该更清楚地表明我可以使用TCO来超过堆栈。我的问题与此无关。我对此感兴趣 a)从学术/智力的角度 b)对于不能递归写入尾部的那些函数,是否可以做些什么?

3 个答案:

答案 0 :(得分:3)

Y组合器允许递归使用非递归函数,但该递归仍通过嵌套函数调用消耗堆栈空间。

对于不能设置为尾递归的函数,您可以尝试使用连续传递样式来重构它们,这会占用堆空间而不是堆栈。

以下是该主题的很好概述:https://www.cs.cmu.edu/~15150/previous-semesters/2012-spring/resources/lectures/11.pdf

答案 1 :(得分:0)

“尾部调用”将使您超出任何堆栈大小限制。参见Programming in Lua, section 6.3: Proper Tail Calls

  

...在进行尾部调用之后,程序无需在堆栈中保留有关调用函数的任何信息。一些语言实现(例如Lua解释器)利用了这一事实,并且在进行尾部调用时实际上不使用任何额外的堆栈空间。我们说这些实现支持适当的尾调用。

答案 2 :(得分:0)

如果您还没有看到它,这里有一个很好的解释:What is a Y-combinator?

总而言之,它有助于证明lambda演算是图灵完备的,但是对于正常的编程任务却没有用。


您可能已经知道,在Clojure中,您只需使用loop / recurimplement a loop即可,这不会消耗堆栈。