Использование комбинатора с фиксированной точкой? Почему переполнение стека здесь? - PullRequest
6 голосов
/ 14 июля 2010

Я чего-то не понимаю.Я хотел создать пример (в 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 Ответ

3 голосов
/ 14 июля 2010

Спасибо Брайану Карперу за его (правильный) ответ в качестве комментария. Исправленный код

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

ведет себя как я ожидал. Мой следующий проект - попытаться построить комбинатор с фиксированной точкой, который найдет нестабильные фиксированные точки. Я не верю, что комбинатор Y, реализованный выше, может это сделать.

...