Tôi đang bối rối như thế nào def và để cho các biến ràng buộc khác nhau. Ai đó có thể giải thích cho tôi lý do tại sao công trình này:Đệ quy bên trong cho phép chức năng
(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))
)
)))
)
Nhưng khi tôi cố gắng để khai báo các chức năng như để cho nó thất bại trong việc biên dịch:
(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)
)
)
EDIT: Công việc này, sử dụng kỹ thuật cho thấy bởi 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)
)
)
Rất thú vị. Vì vậy, bạn về cơ bản chỉ cần đi qua trong các chức năng như một đối số để trình biên dịch không bị lẫn lộn về nó không được xác định. Tôi không thể thử điều này ngay bây giờ, nhưng tôi sẽ thử phương pháp này sau. – onit