Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binding 在不完全重新实现函数的情况下更改递归函数契约?_Binding_Clojure - Fatal编程技术网

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