# Generates set partitions recursively
def partitions(set_):
if not set_:
yield []
return
for i in xrange(2**len(set_)/2):
print i
parts = [set(), set()]
for item in set_:
parts[i&1].add(item)
i >>= 1
for b in partitions(parts[1]):
yield [parts[0]]+b
#for i in xrange(5):
# print list(partitions(set(range(i))))
print list(partitions(set(range(2))))
IyBHZW5lcmF0ZXMgc2V0IHBhcnRpdGlvbnMgcmVjdXJzaXZlbHkKCgoKZGVmIHBhcnRpdGlvbnMoc2V0Xyk6CiAgICBpZiBub3Qgc2V0XzoKICAgICAgICB5aWVsZCBbXQogICAgICAgIHJldHVybiAgICAKICAgIGZvciBpIGluIHhyYW5nZSgyKipsZW4oc2V0XykvMik6IAogICAgICAgIHByaW50IGkgICAgICAgIAogICAgICAgIHBhcnRzID0gW3NldCgpLCBzZXQoKV0KICAgICAgICBmb3IgaXRlbSBpbiBzZXRfOgogICAgICAgICAgICBwYXJ0c1tpJjFdLmFkZChpdGVtKSAKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaSA+Pj0gMQogICAgICAgICAgICAgICAgICAgICAKICAgICAgICBmb3IgYiBpbiBwYXJ0aXRpb25zKHBhcnRzWzFdKToKICAgICAgICAgICAgeWllbGQgW3BhcnRzWzBdXStiCgoKI2ZvciBpIGluIHhyYW5nZSg1KToKIyAgIHByaW50IGxpc3QocGFydGl0aW9ucyhzZXQocmFuZ2UoaSkpKSkKCnByaW50IGxpc3QocGFydGl0aW9ucyhzZXQocmFuZ2UoMikpKSk=