Fibonacci.lsp



; 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)))