之前做了一个关于动态规划的题目,因为以前都是用C++写代码,所以很自然的用map reduce 模仿for循环的方式来处理,导致非常的繁琐。
昨天突然想到,用记忆化搜索的方式使用递归也可以。
比如 Fibonacci 数列,直接用递归可以这么写:
(defn fib [n]
(condp = n
0 1
1 1
(+ (fib (dec n)) (fib (- n 2)))))
可是,因为在递归过程中,每次计算fib(n)都会按照递归树执行到底,导致非常慢。
执行时间为:
(time (fib 30)) => "Elapsed time: 8179.04028 msecs"
如果改成记忆化搜索的形式:
(def m-fib
(memoize (fn [n]
(condp = n
0 1
1 1
(+ (m-fib (dec n)) (m-fib (- n 2)))))))
执行时间为:
(time (m-fib 30)) => "Elapsed time: 1.282557 msecs"
我觉得这个方式不错,类似的递归问题都可以这么写。