【Clojure程序设计】Clojure中转化互递归的方法
2014-06-19 19:52
351 查看
1. 直接转化为自递归
不是那么容易
2. Trampolining
(trampolining f & partial-args)
如果f的返回值不是一个函数,那么trampoline就像直接调用了f一样;
如果f的返回值是一个函数,那么trampoline会假定你打算递归的调用这个函数,并替你执行该调用。trampoline管理着它自己的recur,所以它会一直调用你的函数,知道返回的不再是函数为止。
(declare my-odd? my-even?)
(defn my-odd?
(if (zero? n)
false
#(my-even? (dec n))))
(defn my-even?
(if (zero? n)
true
#(my-odd? (dec n))))
(println (trampoline my-even? 1000000))
3.用惰性化代替递归(lazy)
(defn lazy-parity
[]
(iterate (partial - 1) 0))
(defn my-even2?
(= 0 (nth (lazy-parity) n)))
(defn my-odd2?
(false? (my-even2? n)))
(println (my-even2? 1000000))
replace的例子(这里用到了clojure的另外一个特性multi-method):
(defn- coll-or-scalar [x & _] (if (coll? x) :collection :scalar))
(defmulti replace-symbol coll-or-scalar)
(defmethod replace-symbol :collection
[coll oldsym newsym]
(lazy-seq
(when (seq coll)
(cons (replace-symbol (first coll) oldsym newsym)
(replace-symbol (rest coll) oldsym newsym))))
)
(defmethod replace-symbol :scalar
[sym oldsym newsym]
(if (= sym oldsym) newsym sym))
4.memozie
(declare m f)
(defn m
(if (zero? n)
0
(- n (f (m (dec n))))))
(defn f
(if (zero? n)
1
(- n (m (f (dec n))))))
(def m (memoize m))
(def f (memoize f))
(println (time (m 100)))
不是那么容易
2. Trampolining
(trampolining f & partial-args)
如果f的返回值不是一个函数,那么trampoline就像直接调用了f一样;
如果f的返回值是一个函数,那么trampoline会假定你打算递归的调用这个函数,并替你执行该调用。trampoline管理着它自己的recur,所以它会一直调用你的函数,知道返回的不再是函数为止。
(declare my-odd? my-even?)
(defn my-odd?
(if (zero? n)
false
#(my-even? (dec n))))
(defn my-even?
(if (zero? n)
true
#(my-odd? (dec n))))
(println (trampoline my-even? 1000000))
3.用惰性化代替递归(lazy)
(defn lazy-parity
[]
(iterate (partial - 1) 0))
(defn my-even2?
(= 0 (nth (lazy-parity) n)))
(defn my-odd2?
(false? (my-even2? n)))
(println (my-even2? 1000000))
replace的例子(这里用到了clojure的另外一个特性multi-method):
(defn- coll-or-scalar [x & _] (if (coll? x) :collection :scalar))
(defmulti replace-symbol coll-or-scalar)
(defmethod replace-symbol :collection
[coll oldsym newsym]
(lazy-seq
(when (seq coll)
(cons (replace-symbol (first coll) oldsym newsym)
(replace-symbol (rest coll) oldsym newsym))))
)
(defmethod replace-symbol :scalar
[sym oldsym newsym]
(if (= sym oldsym) newsym sym))
4.memozie
(declare m f)
(defn m
(if (zero? n)
0
(- n (f (m (dec n))))))
(defn f
(if (zero? n)
1
(- n (m (f (dec n))))))
(def m (memoize m))
(def f (memoize f))
(println (time (m 100)))
相关文章推荐
- 用递归的方法将一个整数n转化为字符串(不是调用函数,直接输出)
- 异常处理、递归和单体程序设计方法1
- 递归转化为非递归的一般方法
- 异常处理、递归和单体程序设计方法2
- 递归转化为非递归的一般方法
- 递归程序设计方法及实例
- 将整数转化为二进制,采用递归方法
- 递归到动态规划的一般转化方法
- 一种使用递归从数据库读取数据来动态建立菜单的方法
- 将DataView转化为DataTable方法!
- 几种字符串到byte[] 数组转化为String 的方法
- 论程序设计方法[转帖]
- STL学习笔记:用非递归的方法实现汉诺塔问题
- 一个简单的将数字转化为汉字大写的方法
- 基于消息分发的多线程程序设计,常见的问题,以及解决方法
- 递归控件以加入JS方法
- 递归的方法画树形结构
- 论程序设计方法[转帖]
- 用“类”来代替“递归方法”,用php举例。
- [转帖]论程序设计方法