5

Estoy confundido acerca de algo. Quería generar un ejemplo (en Clojure) que demostrara cómo se podría usar un combinador de punto fijo para evaluar el punto fijo de una secuencia que matemáticamente converge después de un número infinito de aplicaciones pero que, de hecho, convergería después de un número finito de pasos debido a la precisión finita de los puntos flotantes. Aparentemente me falta algo aquí.Uso del combinador de punto fijo? ¿Por qué un desbordamiento de pila aquí?

(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))))) 

A continuación, puedo conseguir

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

No entiendo este desbordamiento de pila. De manera más general, en relación con mi publicación anterior, me pregunto si alguien puede presentar una versión "correcta" de un combinador de punto fijo que se puede usar para aproximar puntos fijos de secuencias de esta manera.

+3

¿Debería la última línea ser '(func (* 0.5 x))'? Parece que es recurrente con la misma x para siempre. –

Respuesta

2

Gracias a Brian Carper por su respuesta (correcta) como comentario. El código corregido

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

se comporta como esperaba. Mi próximo proyecto es intentar construir un combinador de punto fijo que encuentre puntos fijos inestables. No creo que el combinador Y implementado anteriormente pueda hacer esto.

Cuestiones relacionadas