def get_pairs(n, pool=None): if pool is None: pool = set(range(1, n + 1)) if not pool: yield [] for i in pool: for i2 in pool.intersection(range(i * 2, n + 1)): for pairs in get_pairs(n, pool - {i, i2}): yield [(i, i2)] + pairs print(*get_pairs(6), sep='\n')
Standard input is empty
[(1, 4), (2, 5), (3, 6)] [(1, 4), (3, 6), (2, 5)] [(1, 5), (2, 4), (3, 6)] [(1, 5), (3, 6), (2, 4)] [(2, 4), (1, 5), (3, 6)] [(2, 4), (3, 6), (1, 5)] [(2, 5), (1, 4), (3, 6)] [(2, 5), (3, 6), (1, 4)] [(3, 6), (1, 4), (2, 5)] [(3, 6), (1, 5), (2, 4)] [(3, 6), (2, 4), (1, 5)] [(3, 6), (2, 5), (1, 4)]