(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