5

Je suis confus au sujet de quelque chose. Je voulais générer un exemple (dans Clojure) démontrant comment un combinateur de points fixes pourrait être utilisé pour évaluer le point fixe d'une séquence qui converge mathématiquement après un nombre infini d'applications mais qui, en fait, convergerait après un nombre fini d'étapes dues à la précision finie des points flottants. Il me manque apparemment quelque chose ici.Utilisation du combinateur de points fixes? Pourquoi un débordement de pile ici?

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

Je peux alors obtenir

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

Je ne comprends pas ce débordement de pile. Plus généralement, en relation avec mon article précédent, je me demande si quelqu'un peut présenter une version "correcte" d'un combinateur de points fixes qui peut être utilisé pour approximer des points fixes de séquences de cette manière.

+3

La dernière ligne devrait-elle être '(func (* 0.5 x))'? On dirait que c'est récurrent avec le même x pour toujours. –

Répondre

2

Merci à Brian Carper pour sa (bonne) réponse en tant que commentaire. Le code corrigé

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

se comporte comme prévu. Mon prochain projet est d'essayer de construire un combinateur de points fixes qui trouve des points fixes instables. Je ne crois pas que le combinateur Y implémenté ci-dessus puisse le faire.