Votre question dit que vous vouliez voir précisément ce que le code ressemblerait, alors voici un exemple codé à la main d'une solution d'espace O (n):
def combinations(input_list, acc=''):
if not input_list:
yield acc
return
next_val = input_list[0]
for rest in combinations(input_list[1:], acc):
yield rest
acc += next_val
# In python 3.2, you can use "yield from combinations(input_list[1:], acc)"
for rest in combinations(input_list[1:], acc):
yield rest
Notez que l'arithmétique sous-chaîne pourrait être coûteuse (car il doit copier la chaîne à plusieurs reprises), alors voici une version légèrement plus efficace en termes de complexité:
def combinations(input_list, acc='', from_idx=0):
if len(input_list) <= from_idx:
yield acc
return
next_val = input_list[from_idx]
for rest in combinations(input_list, acc, from_idx + 1):
yield rest
acc += next_val
# In python 3.2, you can use "yield from combinations(input_list[1:], acc)"
for rest in combinations(input_list, acc, from_idx + 1):
yield rest
Je ne suis pas en Python 3.2, mais si vous étiez vous pourriez écrire comme ceci:
def combinations(input_list, acc='', from_idx=0):
if len(input_list) <= from_idx:
yield acc
return
next_val = input_list[from_idx]
yield from combinations(input_list, acc, from_idx + 1)
acc += next_val
yield from combinations(input_list, acc, from_idx + 1)
Je tiens également à noter que cela est purement théorique puisque itertools.combinations
fait un excellent travail et travaille pour une plus large tableau d'entrées (y compris les expressions de générateur).
-1 parce que la question demande spécifiquement de ne pas simplement utiliser 'itertools.combinations'. – lvc