5

Sono confuso per qualcosa. Volevo generare un esempio (in Clojure) che dimostri come un combinatore a virgola fissa possa essere usato per valutare il punto fisso di una sequenza che converge matematicamente dopo un numero infinito di applicazioni ma, in realtà, convergerebbe dopo un numero finito di passi dovuti alla precisione finita dei punti fluttuanti. Mi sembra che manchi qualcosa qui.Utilizzo del combinatore di punti fissi? Perché uno stack trabocca qui?

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

posso quindi ottenere

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

non capisco questo overflow dello stack. Più in generale, in relazione al mio post precedente, mi chiedo se qualcuno possa presentare una versione "corretta" di un combinatore a virgola fissa che può essere usata per approssimare punti fissi di sequenze in questo modo.

+3

L'ultima riga potrebbe essere '(func (* 0.5 x))'? Sembra che sia ricorrente con la stessa x per sempre. –

risposta

2

Grazie a Brian Carper per la sua risposta (corretta) come commento. Il codice corretto

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

si comporta come mi aspettavo. Il mio prossimo progetto è di provare a costruire un combinatore a punti fissi che trovi punti fissi instabili. Non credo che il combinatore a Y implementato sopra possa farlo.

Problemi correlati