def memo(f):
    f.cache = {}

def _f(*args, **kwargs):
    if args not in f.cache:
        f.cache[args] = f(*args, **kwargs)
return f.cache[args]
return _f

@memo
def mult_comb(factors):
    result = set()
result.add(tuple(sorted(factors)))
for i, f1 in enumerate(factors):
    factors2 = list(factors[:i] + factors[i + 1:])
for k in range(i, len(factors2)):
    factors2[k] *= f1
result.update(mult_comb(tuple(factors2)))
factors2[k] /= f1
return result
Вернуть различные мультипликативные комбинации списка чисел в Python