2016-03-22 7 views
1

Ich versuche eine rekursive Lambda-Funktion (die Annahme von zwei Argumenten) zu schreiben, die den Schnittpunkt zwischen zwei (möglicherweise) unsortierten Mengen findet. Hier ist der Code, die ich die meisten glauben, finden einfach:4clojure: set-intersection, rekursives Lambda

(fn intersection [a b] 
(fn inner [x y out] 
    (if (empty? x) out 
    (if (nil? (some ((set (first x)) y))) 
    (inner (rest x) y out)))) 
    (inner (rest x) y (cons (first x) out)) 
    (inner a b '[]) 
) 

Ich hoffe, das Lambda-Funktion zu verwenden Kreuzung anstelle des Strich _, dass folgt:

(= (__ #{0 1 2 3} #{2 3 4 5}) #{2 3})

jedoch , dieser Code kann nicht kompiliert werden und besteht darauf, dass Java Unable to resolve symbol: inner in this context ...

Irgendwelche Vorschläge?

Quelle: http://www.4clojure.com/problem/81

+0

Sorry, wenn die Fehlerbeschreibung ist ein wenig knapp, aber es fühlt sich an, als ob wir in Kreisen bewegt haben, um dieses Problem für eine gute Weile zu lösen :( –

+0

Kreuzung nimmt zwei Parameter und gibt einen anderen Satz, richtig? Dann warum gibst du stattdessen eine funktion zurück? – nha

Antwort

3

Sie könnten versuchen:

#(set (filter %1 %2)) 

Da Sets Funktionen (siehe ein weiteres nützliches Beispiel there) sind. Die Syntax mit %1 und %2 das gleiche wie das Schreiben ist:

(fn [s1 s2] (set (filter s1 s2))) 

Oder noch kurz und bündig:

(comp set filter) 

In Bezug auf die inner Fehler, fehl am Platze Sie einfach die Pars (aber ich sehe nicht wirklich die Logik anders):

(fn intersection [a b] 
    (fn inner [x y out] 
    (if (empty? x) out 
     (if (nil? (some ((set (first x)) y))) 
      (inner (rest x) y out))) 
    (inner (rest x) y (cons (first x) out)) 
    (inner a b '[]))) 

Wenn Sie darauf bestehen, manuell den Satz auf den Aufbau (die ich nicht so lange her war), konnte man mit so am Ende wie folgt:

Aber wirklich die erste Lösung ist die eleganteste.