Использование комбинатора неподвижной точки? Почему переполнение стека здесь?

Я смущен чем-то. Я хотел генерировать пример (в 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)

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

6
задан duplode 7 July 2019 в 00:04
поделиться

1 ответ

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

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

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

3
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: