Binding 在不完全重新实现函数的情况下更改递归函数契约?
我想更改以下快速排序实现的约定,以返回执行排序操作所需的递归调用数 资料来源:Binding 在不完全重新实现函数的情况下更改递归函数契约?,binding,clojure,Binding,Clojure,我想更改以下快速排序实现的约定,以返回执行排序操作所需的递归调用数 资料来源: (defn qsort[[pivot&xs]] (当旋转时) (让[较小的#(
(defn qsort[[pivot&xs]]
(当旋转时)
(让[较小的#(<%枢轴)]
(懒猫(qsort(过滤更小的X))
[支点]
(qsort(删除较小的xs‘‘‘‘‘‘‘‘‘)’)
我想做的是实现一个内部使用上述qsort实现的计数qsort
我正在寻找一个如何做到这一点的例子。我怀疑
(bind…
可能与此有关。我对这个问题进行了一段时间的思考,下面是我的想法:
(defn counted-qsort [coll]
(let [count (atom 0) qs qsort]
(with-redefs [qsort (fn [coll]
(swap! count inc)
(prn coll)
(qs coll))]
(dorun (qsort coll)))
(deref count)))
此函数临时重新定义qsort
,以便它可以管理一个原子,该原子包含最终调用qsort
的次数。let绑定中的qs
允许在重新定义的版本中引用原始qsort
函数,以避免无限递归
我使用“计数”而不是“深度”,因为我不确定“深度”是否是正确的术语。此函数计算调用qsort
的次数,而不是“树”的实际深度
我不知道这种方法是否能保持懒惰
用于调试的带有prn
的输出示例:
[1 2 3]
()
(2 3)
()
(3)
()
()
7 ;return value
我假设Clojure 1.3和qsort
已在同一名称空间中定义
[1 2 3]
()
(2 3)
()
(3)
()
()
7 ;return value