2010-08-14 21 views
5
tek argüman fonksiyonu için Y-combinator Doing

iyi belgelenmiştir: http://rosettacode.org/wiki/Y_combinator#ClojureY-Combinator'ı Clojure'da iki argümanlı bir özyinelemeye mi uygulamak istiyorsunuz? Böyle Clojure içinde faktöryel veya fibonacci olarak

Sorum şu - nasıl bir iki argüman fonksiyonu için yaparım örneğin bu gaz giderici olarak?

(burada Varsayım ı yinelemeli bu sorunu çözmek istiyoruz ve bu sigara deyimsel Clojure kod başka bir nedenle kasıtlı olmasıdır)

[olmayan y combinator versiyonu]

(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))' gerçekten 'söylemek ayrıntılı bir yoldur (= n 1)'. Bu arada dördüncü ve beşinci hat üçte birinden daha fazla girintiye neden giriyor? – Svante

+0

Bu alıcı 1 temelli yapmak için belirli bir neden var mı? – Svante

cevap

4

argsapply 'd olduğu için hataların sayısı hiçbir şey değişmez. Sadece get_ yapısını değiştirmek gerekir:

 
(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

It' d ileriye doğru dürüst olun.

((Y H) 4 5) 

Nerede 4 ve 5 Eğer H iletmek istediğiniz argümanları şunlardır: Aynı ol' Y-Combinator uygulamak Sonra

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

:

bir fonksiyon H olduğunu farz edelim

Birleştirici esasen H'de en üst düzey işlevle "uğraşmaktır", sıkı çalışmayı yapan (değil, burada 2 olanı).