(defun fib-helper (a b p q n)
  (cond ((zerop n) b)
        ((oddp n) (let ((aq (times a q)))
                    (fib-helper (plus (times b q) aq (times a p))
                                (plus (times b p) aq)
                                p
                                q
                                (sub1 n))))
        (t (let ((qq (times q q)))
             (fib-helper a
                         b
                         (plus (times p p) qq)
                         (plus qq (times 2 p q))
                         (quotient n 2))))))

(defun fib (n)
  (fib-helper 1 0 0 1 n))