;;; three implementation of fibonacci number
; recusive style of fibonacci number
(define (fib1 n)
(if (< n 3)
1
(+ (fib (- n 1))
(fib (- n 2)))))
; C style iteration of fibonacci number
(define (fib2 n)
(let ((n1 1)(n2 1)(tmp 0)(i 2))
(while (< i n)
(set! tmp (+ n1 n2))
(set! n1 n2)
(set! n2 tmp)
(set! i (+ i 1)))
n2))
; lisp style iteration of fibonacci
; scheme do tail recursion optimizatiion in default
; this will run equally fast as fib2
(define fib3
(lambda (n)
(let t ((a 0) (b 1) (i 0))
(if (= i n)
b
(t b (+ a b) (+ i 1))))))
(display "fib run//res = ")
(time (fib1 80)) ; test excution time of (fib1 80), last long time
(display "fib2 run//res =")
(time (fib2 80))
(display "fib3 run//res =")
(time (fib3 80))
(fib 111) ; 70492524767089125814114