我很困惑,如何def和让变量绑定不同。谁能给我解释一下为什么这个工程:让函数递归
(def leven
(memoize (fn [x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (leven (rest x) y) 1)
(+ (leven x (rest y)) 1)
(+ (leven (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)))
)
但是当我尝试申报功能让它无法编译:
(def leven
(let [l (memoize (fn [x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (l (rest x) y) 1)
(+ (l x (rest y)) 1)
(+ (l (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)
))]
(l x y)
)
)
编辑:这工作,使用显示由ANKUR技术。
(defn leven [x y]
(let [l (memoize (fn [f x y]
(cond (empty? x) (count y)
(empty? y) (count x)
:else (min (+ (f f (rest x) y) 1)
(+ (f f x (rest y)) 1)
(+ (f f (rest x) (rest y)) (if (= (first x) (first y)) 0 1))
)
)
))
magic (partial l l)]
(magic x y)
)
)
非常有趣。所以你基本上只是传递函数作为参数,所以编译器不会对它没有被定义的困惑。我现在不能尝试这个,但我稍后会尝试这种方法。 – onit