Я чем-то смущен. Я хотел создать пример (в 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)
Я не понимаю, это переполнение стека. В целом, в связи с моим предыдущим сообщением, мне интересно, может ли кто-нибудь представить «правильную» версию комбинатора с фиксированной точкой, который может использоваться для аппроксимации фиксированных точек последовательностей таким образом.
Если последняя строка, возможно, будет '(func (* 0.5 x))'? Похоже, что он повторяется с тем же х навсегда. –