serious stuff
www.cubbi.com
personal
programming
fibonacci numbers
algorithms
benchmarks
forth examples
postscript examples
muf examples
joy examples
j examples
scheme examples
hope examples
ocaml examples
haskell examples
prolog examples
c++ examples
java examples
assembly language examples
fortran examples
c examples
sh examples
awk examples
perl examples
tcl examples
asmix
hacker test
resume
science
martial arts
fun stuff
www.cubbi.org
|
Scheme
Date: 1975, standardized in IEEE 1178-1990 (R1995)
Type: Functional lisp-based language
Usage: academic (especially in MIT), scripting language for software packages such as GIMP
ALGORITHM 1A: BINARY RECURSION |
(declare (usual-integrations))
(define (fib m)
(if (< m 2)
m
(+ (fib (- m 1)) (fib (- m 2)))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(fib (abs n))))
(define main (lambda (n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n))))))
|
ALGORITHM 1B: CACHED BINARY RECURSION |
(declare (usual-integrations))
(define (fib m v)
(if (positive? (vector-ref v m))
(vector-ref v m)
(let ((result (if (< m 2)
m
(+ (fib (- m 1) v) (fib (- m 2) v)))))
(begin (vector-set! v m result) result))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(fib (abs n) (make-vector (1+ (abs n)) 0))))
(define main (lambda (n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n))))))
|
ALGORITHM 2A: CACHED LINEAR RECURSION / INFINITE LAZY EVALUATED LIST |
(declare (usual-integrations))
(define (lazy-fib-list)
(letrec ((next-number (lambda (n m)
(cons n (delay (next-number m (+ n m)))))))
(next-number 0 1)))
(define lazy-head car)
(define (lazy-tail lazy-list) (force (cdr lazy-list)))
(define (nth n lazy-list)
(if (<= n 0) (lazy-head lazy-list)
(nth (- n 1) (lazy-tail lazy-list))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(nth (abs n) (lazy-fib-list))))
(define (main n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n)))))
|
ALGORITHM 2B: LINEAR RECURSION WITH ACCUMULATOR |
(declare (usual-integrations))
(define (fib a b c)
(if (zero? c)
a
(fib (+ a b) a (-1+ c))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(fib 0 1 (abs n))))
(define (main n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n)))))
|
ALGORITHM 2C: IMPERATIVE LOOP WITH MUTABLE VARIABLES |
(declare (usual-integrations))
(define (fib n)
(do ((x1 0) (x2 1) (tmp 1) (i 1 (1+ i)))
((> i n) x1)
(set! tmp (+ x1 x2))
(set! x1 x2)
(set! x2 tmp)))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(fib (abs n))))
(define (main n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n)))))
|
ALGORITHM 3A: MATRIX MULTIPLICATION |
(declare (usual-integrations))
(define (transpose rows) (apply map (cons list rows)))
(define (dot v1 v2) (reduce + 0 (map * v1 v2)))
(define (mm m1 m2)
(map (lambda (row)
(map (lambda (col)
(dot row col)) (transpose m2))) m1))
(define power (lambda (f u b n)
(if (positive? n)
(if (even? n)
(power f u (f b b) (quotient n 2))
(power f (f u b) (f b b) (quotient n 2)))
u)))
(define (fib n)
(if (zero? n)
0
(car (car (power mm `((1 0)(0 1)) `((1 1)(1 0)) (-1+ n) )))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(fib (abs n))))
(define (main n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n)))))
|
ALGORITHM 3B: FAST RECURSION |
(declare (usual-integrations))
(define (fib n)
(case n
((0) (values 0 0))
((1) (values 1 0))
(else (let ((m (quotient n 2)))
(call-with-values (lambda () (fib m))
(lambda (k2 k1)
(let ((k3 (+ k1 k2))
(k1^2 (* k1 k1))
(k2^2 (* k2 k2))
(k3^2 (* (+ k1 k2) (+ k1 k2))))
(if (even? n)
(values (* (+ k1 k3) k2)
(+ k1^2 k2^2))
(values (+ k3^2 k2^2)
(* (+ k1 k3) k2))))))))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(car (call-with-values (lambda () (fib (abs n))) cons))))
(define (main n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n)))))
|
ALGORITHM 3C: BINET'S FORMULA WITH ROUNDING |
(declare (usual-integrations))
(define (fib n)
(let ((phi (/ (1+ (sqrt 5)) 2)))
(round (/ (expt phi n) (sqrt 5)))))
(define (f n)
((if (and (negative? n) (even? n)) - identity-procedure)
(fib (abs n))))
(define (main n)
(display (string-append
(number->string n)
"th Fibonacci number is "
(number->string (f n)))))
|
|