2016-03-22 16 views
1

2つの(潜在的に)ソートされていない集合の間の交差を見つける再帰ラムダ関数(2つの引数を受け入れる)を書くことを試みています。ここで私はほとんど信じているコードは、まっすぐ進むでしょうです:4clojure:集合交差、再帰的ラムダ

(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 '[]) 
) 

が、私はアンダースコアの代わりに、このラムダ関数に交差点を使用することを願っています_それは、次のとおりです。ただし

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

このコードは、JavaがUnable to resolve symbol: inner in this contextであることを主張してコンパイルに失敗します。

何か提案がありますか?

ソース:http://www.4clojure.com/problem/81

+0

申し訳ありませんが、エラーの説明が少し簡潔ですが、この問題を解決するためにサークル内を移動しているように感じています:( –

+0

交差点は2つのパラメータをとり、別のセットを返します。代わりに関数を返すのですか? – nha

答えて

3

は、あなたが試みることができる:

#(set (filter %1 %2)) 

セットは機能があるので、(他の有用な例thereを参照してください)。

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

、あるいは、より簡潔に:%1%2と構文は書き込みと同じです

(comp set filter) 

innerエラーについて、あなたは単に括弧を置き忘れ(私は実際に表示されませんそれ以外の場合はロジック):

手動でセットを構築することを強くお勧めする場合は、これで終わる可能性がありますそのようなメーリング:

(fn [s1 s2] 
    (reduce #(if (contains? s2 %2) (conj %1 %2) %1) #{} s1)) 

しかし、実際には最初の解決策は最もエレガントです。