def perm1(n): a = list(range(n)) def sub(i): if i == n - 1: yield tuple(a) else: for k in range(i, n): a[i], a[k] = a[k], a[i] yield from sub(i + 1) a[i], a[k] = a[k], a[i] yield from sub(0) def perm2(n): a = list(range(n)) def sub(i): if i == n - 1: yield tuple(a) else: for k in range(i, n): a[i], a[k] = a[k], a[i] yield from sub(i + 1) x = a[i] for k in range(i + 1, n): a[k - 1] = a[k] a[n - 1] = x yield from sub(0)