https://gist.github.com/797041
遅延シーケンスを返すようにしたら、だらだらと長くなってしまいました。
冪集合なんだから集合で返した方がいいのかもしれないですが、入力に重複がない事を前提とするなら遅延シーケンスでも正しい結果を返せるので私はこの方が嬉しいです。
小林さんの方法では同じ引数の再帰が2箇所がある点と、unionの引数にシーケンスを与えてる点が良くないと思います。
unionの引数は集合を想定しているので、シーケンスを与えると重複を許してしまいます。
引数のリストには重複がない事を前提とするなら、concat でいいと思います。
reduceを使うとコンパクトなので、集合を返す場合はこっちの方がいいかもしれません。
(defn powerset [ls]
(reduce (fn [acc elem] (union acc (set (map #(conj % elem) acc)))) #{#{}} ls))
2011年1月26日15:02 ken.coba <ken....@gmail.com>: