2010-08-14 32 views
5

Làm Y Combinator cho một hàm đối số duy nhất như thừa hoặc fibonacci trong Clojure cũng được ghi chép lại: http://rosettacode.org/wiki/Y_combinator#ClojureÁp dụng Y-Combinator vào một hàm đệ quy với hai đối số trong Clojure?

Câu hỏi của tôi là - làm thế nào để bạn làm điều đó cho một hàm hai lập luận như getter này cho ví dụ?

(Assumption ở đây là tôi muốn giải quyết vấn đề này một cách đệ quy và mã clojure phi thành ngữ này là có chủ ý vì lý do khác)

[phiên bản y-combinator phi]

(defn get_ [n lat] 
    (cond 
     (empty? lat)() 
     (= 0 (- n 1)) (first lat) 
     true (get_ (- n 1) (rest lat)))) 

(get_ 3 '(a b c d e f g h i j)) 
+0

'(= 0 (- n 1))' thực sự là một cách công phu để nói '(= n 1)'. Tại sao dòng thứ tư và thứ năm thụt vào nhiều hơn thứ ba, bằng cách này? – Svante

+0

Có lý do cụ thể nào để đặt chương trình này dựa trên cơ sở 1 không? – Svante

Trả lời

4

Số lượng arg không thay đổi bất cứ điều gì vì số argsapply 'd. Bạn chỉ cần thay đổi cấu trúc của get_:

 
(defn get_ [f] 
    (fn [n lat] 
    (cond 
     (empty? lat)() 
     (= 1 n) (first lat) 
     :else (f (dec n) (next lat))))) 

(defn Y [f] 
    ((fn [x] (x x)) 
    (fn [x] 
    (f (fn [& args] 
      (apply (x x) args)))))) 
 
user=> ((Y getf) 3 '(a b c d e f g h i j)) 
c 
2

Nó' d khá thẳng về phía trước.

Giả sử bạn đã có một hàm H:

(def H 
    (fn [x] 
     (fn [x y] 
       (stuff happens)))) 

Sau đó, bạn áp dụng các ol cùng' Y-Combinator:

((Y H) 4 5) 

đâu 45 là đối số bạn muốn vượt qua H Bộ tổ hợp cơ bản là "xử lý" chức năng cấp cao nhất trong H, không phải là bộ phận thực hiện công việc khó khăn (một cái có tính chất 2, ở đây).

Các vấn đề liên quan