(defparameter *memo* (make-hash-table))
(defun f (n)
(let ((m (gethash n *memo*)))
(if m
m
(setf (gethash n *memo*)
(cond ((= n 0) 4)
((= n 1) 17/4)
(t (+ (- 108 (/ 815 (f (- n 1))))
(/ 1500 (* (f (- n 1)) (f (- n 2)))))))))))
(let ((a (f 15)))
(format t "~A~%" a)
(format t "~,10F~%" a)
;; stackoverflow.com/a/3321167
(multiple-value-bind (q r) (truncate a)
(format t "~D.~10,'0,D~%" q (truncate (* (abs r) (expt 10 10))))))
KGRlZnBhcmFtZXRlciAqbWVtbyogKG1ha2UtaGFzaC10YWJsZSkpCgooZGVmdW4gZiAobikKICAobGV0ICgobSAoZ2V0aGFzaCBuICptZW1vKikpKQogICAgKGlmIG0KICAgICAgICBtCiAgICAgICAgKHNldGYgKGdldGhhc2ggbiAqbWVtbyopCiAgICAgICAgICAgICAgKGNvbmQgKCg9IG4gMCkgNCkKICAgICAgICAgICAgICAgICAgICAoKD0gbiAxKSAxNy80KQogICAgICAgICAgICAgICAgICAgICh0ICgrICgtIDEwOCAoLyA4MTUgKGYgKC0gbiAxKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICgvIDE1MDAgKCogKGYgKC0gbiAxKSkgKGYgKC0gbiAyKSkpKSkpKSkpKSkKCihsZXQgKChhIChmIDE1KSkpCiAgKGZvcm1hdCB0ICJ+QX4lIiBhKQogIChmb3JtYXQgdCAifiwxMEZ+JSIgYSkKICA7OyBzdGFja292ZXJmbG93LmNvbS9hLzMzMjExNjcKICAobXVsdGlwbGUtdmFsdWUtYmluZCAocSByKSAodHJ1bmNhdGUgYSkKICAgIChmb3JtYXQgdCAifkQufjEwLCcwLER+JSIgcSAodHJ1bmNhdGUgKCogKGFicyByKSAoZXhwdCAxMCAxMCkpKSkpKQo=