定点组合器用法?为什么堆栈在这里溢出?

时间:2010-07-13 23:18:47

标签: functional-programming clojure stack-overflow fixed-point y-combinator

我对某事感到困惑。我想生成一个例子(在Clojure中),演示如何使用一个固定点组合器来评估一个序列的固定点,该序列在无限数量的应用之后在数学上收敛但实际上在有限数量的步骤之后收敛有限的浮点精度。我显然在这里遗漏了一些东西。

(defn Y [r]
  ((fn [f] (f f))
   (fn [f]
     (r (fn [x] ((f f) x))))))

(defn simple-convergent [func]
  (fn [x]
    (if (zero? x)
      0.0
      (* 0.5 (func x)))))

我可以得到

user=> ((Y simple-convergent) 0.)
0.0
user=> ((Y simple-convergent) 0.2)
java.lang.StackOverflowError (NO_SOURCE_FILE:0)

我不明白这个堆栈溢出。更一般地说,与我之前的帖子相关,我想知道是否有人可以提供一个“正确”版本的定点组合器,它可以用来以这种方式逼近序列的固定点。

1 个答案:

答案 0 :(得分:2)

感谢Brian Carper作为评论的正确答案。更正的代码

(defn simple-convergent [func]
  (fn [x]
    (if (zero? x)
      0.0
      (func (* 0.5 x)))))

表现得像我预期的那样。我的下一个项目是尝试构建一个固定点组合器,找到不稳定的固定点。我不相信上面实现的Y组合器可以做到这一点。