【问题标题】:Y-combinator does not seem to have any effectY-combinator 似乎没有任何作用
【发布时间】: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


【解决方案1】:

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

对于不能进行尾递归的函数,您可以尝试使用延续传递样式重构它们,这将消耗堆空间而不是堆栈。

这里有一个很好的主题概述:https://www.cs.cmu.edu/~15150/previous-semesters/2012-spring/resources/lectures/11.pdf

【讨论】:

  • 确实,我确实相信这就是我一直在寻找的东西——将堆栈空间使用转换为堆;我有点希望(有点天真:))Y-combinator 可能会以某种方式神奇地做到这一点,但至少我现在有一些事情要做。
  • @AlexGian 你可能会发现this answer 也很有帮助。它使用不同的语言,但它是使用 CPS 处理无法尾递归的算法的一个很好的例子。
  • 啊,太好了——我还不能很流利地阅读 Haskell,所以“第 11 讲”给我带来了一些问题,尽管我可以看到这是我想要的。我更高兴阅读该答案的 ML-ey 风格... F#,是吗?还没用过,不过看起来很酷。现在,如果我能在 Scheme 或 Clojure 中找到它……甚至是 JS(哈哈)。
  • 太棒了。找到了!如果有人感兴趣,这里是:stackoverflow.com/questions/5059142/…
  • CPS 风格在 Android 平板电脑上与 Lua 配合得非常好。 Clojure 没有同样的运气。而不是在这里跑题,因为原来的问题 re y-combinator 已经用尽了,我把新问题移到了这里:stackoverflow.com/questions/50952443/…
【解决方案2】:

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

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

【讨论】:

  • @AlexGian,你能发布你想要做什么的示例代码吗?
  • Brian,我只是在试验 Y 组合器,我想知道它是否能让我超出堆栈限制。我知道我可以递归地编写相同的函数 tail 并让它们像迭代一样工作,但这不是我的意思。如果你仍然想要,我会在 Lua 中发布我是如何做到这一点的,除非有人特别感兴趣,否则这样做是没有意义的。
【解决方案3】:

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

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


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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多