This is a minimal Levenshtein (edit distance) implementation using Clojure with recursion:
(defn levenshtein [s1, i1, s2, i2]
(cond
(= 0 i1) i2
(= 0 i2) i1
:else
(min (+ (levenshtein s1 (- i1 1) s2 i2) 1)
(+ (levenshtein s1 i1 s2 (- i2 1)) 1)
(+ (levenshtein s1 (- i1 1) s2 (- i2 1)) (if (= (subs s1 i1 (+ i1 1)) (subs s2 i2 (+ i2 1))) 0 1))
)
)
)
(defn levenshteinSimple [s1, s2]
(levenshtein s1, (- (count s1) 1), s2, (- (count s2) 1)))
Which can be used like this:
(println (levenshteinSimple "hello", "hilloo"))
(println (levenshteinSimple "hello", "hilloo"))
(println (levenshteinSimple "bananas", "bananas"))
(println (levenshteinSimple "ananas", "bananas"))
And prints this:
2
2
0
1
How can you add memoize to this implementation to improve performance?
Please note: I am a Clojure beginner. These are my first lines in Clojure