Witam, mam za zadanie napisać generator rr(n) zwracający wszystkie relacje równoważności na zbiorze {1,...,n}, reprezentowane jako lista klas abstrakcji. (wszystkie możliwe podziały zbioru)
Na przykład dla n=4 generator powinien zwrócić w dowolnej kolejności następujące listy zbiorów:
[{1},{2},{3},{4}]
[{1,2},{3},{4}]
[{1,3},{2},{4}]
[{1,4},{2},{3}]
[{2,3},{1},{4}]
[{2,4},{1},{3}]
[{3,4},{1},{2}]
[{1,2},{3,4}]
[{1,3},{2,4}]
[{1,4},{2,3}]
[{1,2,3},{4}]
[{1,2,4},{3}]
[{1,3,4},{2}]
[{2,3,4},{1}]
[{1,2,3,4}]
albo te same zbiory w dowolnej innej kolejności.
Mam tyle, ale nie wyświetlają się wszystkie możliwości i już nie wiem co tu zmienić żeby było dobrze, proszę o pomoc :)
def rr(n):
"""funkcja generuje wszystkie podziały zbioru {1,...,n}"""
if n==2:
yield {1},{2}
else:
for i in rr(n-1):
for s in range(n-2):
yield i[:(s)] + (i[s] | {n}, ) + i[(s+1):]
yield i + ({n}, )
for i in rr(4):
print(i)