Clojure 函数式编程:递归与序列处理
1. 懒序列的深入应用
在处理 Fibonacci 序列时,一旦越过某些元素,实际使用的序列部分会在 head-fibo 引用的值的生命周期内被缓存,这通常也就是程序的生命周期。在处理懒序列时,如果不想在遍历过程中缓存序列,就需注意不要保留对序列头部的引用。一般来说,应将懒序列作为返回序列的函数暴露,而非包含序列的变量。若调用者需要显式缓存,可自行创建变量。
1.1 抛硬币问题示例
假设有一个抛硬币结果的序列,其中正面用 :h 表示,反面用 :t 表示,如 [:h :t :t :h :h :h] ,要计算序列中连续出现两次正面的次数。
1.1.1 初始实现
(defn count-heads-pairs [coll]
(loop [cnt 0 coll coll]
(if (empty? coll)
cnt
(recur (if (= :h (first coll) (second coll))
(inc cnt)
cnt)
(rest coll)))))
这个函数通过 loop/recur 实现计数。 loop 引入了 cnt 绑定,初始值为 0,每次递归时缩小
超级会员免费看
订阅专栏 解锁全文
76

被折叠的 条评论
为什么被折叠?



