(defun generate-continued-fraction (lst)
(loop with sexp = (list '+ (first lst) (list '/ 1 (second lst)))
for num in (rest (rest lst)) do
(loop for to-change = sexp then (third to-change)
until (atom (third to-change))
finally (setf (third to-change)
(list '+ (third to-change) (list '/ 1 num))))
finally (return sexp)))Ну а чё, работает же даже:
(generate-continued-fraction '(2 1 2 1 1 4 1)) (+ 2 (/ 1 (+ 1 (/ 1 (+ 2 (/ 1 (+ 1 (/ 1 (+ 1 (/ 1 (+ 4 (/ 1 1))))))))))))
Но вот о производительности такой функции лучше не думать, особенно с учётом того, что потом ещё и eval вызывается. На любом обычном языке мне б и в голову, наверное, не взбрело подобный бред писать, написал бы что-нибудь навроде
(defun continued-fraction (lst)
(loop with rlst = (reverse lst)
with frac = (pop rlst)
for num in rlst do
(setf frac (+ num (/ 1 frac)))
finally (return frac)))Так что надо порядок в голове наводить... %-)

No comments:
Post a Comment