-
-
Save pcalcao/ea4176719d778ea3ab9e to your computer and use it in GitHub Desktop.
Several versions of Fibonacci using Clojure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns sandbox.Testing) | |
; Trivial version | |
(def fib | |
( fn [x] | |
(if (< x 2) x | |
(+ (fib (dec (dec x))) (fib (dec x)))))) | |
; Add some memoization | |
(def fib_mem | |
( memoize | |
( fn [x] | |
(if (< x 2) x | |
(+ (fib_mem (dec (dec x))) (fib_mem (dec x))))))) | |
(def fib_matching_mem | |
(memoize | |
(fn [n] | |
(cond | |
(= n 0) 0 | |
(= n 1) 1 | |
:else (+ (fib_matching_mem (- n 1)) | |
(fib_matching_mem (- n 2))))))) | |
(defn fib_map [n] | |
(last (take (+ n 1) | |
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))) | |
(def fib_complex | |
(lazy-cat [0 1] | |
(map + fib_complex (rest fib_complex)))) | |
(print "Fib, 20: ") (time (fib 20)) | |
(print "Fib Mem, 20: ") (time (fib_mem 20)) | |
(print "Fib Matching, 20: ") (time (fib_matching 20)) | |
(print "Fib Matching Mem, 20: ") (time (fib_matching_mem 20)) | |
(print "Fib Map, 20: ")(time (fib_map 20)) | |
(println (fib_map 20)) | |
(println (fib_matching_mem 20)) | |
(println (fib_matching 20)) | |
(println (fib_mem 20)) | |
(println (fib 20)) | |
;Now the big boys: | |
(print "Fib Mem, 20: ") (time (fib_mem 90)) | |
(print "Fib Matching Mem, 20: ") (time (fib_matching_mem 90)) | |
(print "Fib Map, 20: ")(time (fib_map 90)) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the examples on destructing , Clojure code on your blog.