Clojure 递归与循环:从基础到复杂问题解决
1. Clojure 中的 loop 宏
在 Clojure 里, recur
能轻松提升递归函数的性能,例如 robust-bag-sequences*
函数就是尾递归的,它仅返回对自身的完整调用。而 loop
宏其实与使用 recur
的递归函数极为相似。
loop
宏的优势在于可置于函数内部,这能避免编写用于设置递归的公共函数以及实际执行递归的辅助函数,从而让命名空间更易读。不过要注意,Clojure 还提供了另一种避免公共函数的机制,即使用 defn-
而非 defn
定义的函数,这类函数仅在定义它们的命名空间内可用。
loop
的基本逻辑和结构与使用 recur
的函数很相似: loop
调用始于一个或多个绑定,借助 recur
重新开始。和递归函数一样,每次迭代时 recur
的参数必须修改,以避免无限循环,而且 loop
调用也必须是尾递归的。
下面是一个使用 loop
处理杂货店商品的简单函数示例:
(def process identity)
(defn grocery-verification [