5

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

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

+3

Если последняя строка, возможно, будет '(func (* 0.5 x))'? Похоже, что он повторяется с тем же х навсегда. –

ответ

2

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^