; VersiOn aplicando la definiciOn directamente
; int -> int
(defun fibonacci (n)
(if (< n 2)
1
(+ (fibonacci (1- n)) (fibonacci (- n 2)))))
; VersiOn "optimizada". El truco consiste en aplicar
; la definiciOn "hacia delante".
; int -> int
(defun fibonacci-opt (n)
(case n
((1 2) 1)
(t (fibonacci-opt-aux 1 1 2 n))))
(defun fibonacci-opt-aux (fn1 fn2 i n)
(if (= i n)
(+ fn1 fn2)
(fibonacci-opt-aux fn2 (+ fn1 fn2) (1+ i) n)))