あなたの質問は、コードがどのように見えるかを見たいと具体的に言っていたので、ここに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
部分文字列の演算は(文字列を何度もコピーする必要があるため)コストがかかる可能性があるため、複雑さの点で少し効率的なバージョンを次に示します。
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
私はPython3.2を使用していませんが、もしあなたがそうなら、次のように書くことができます:
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)
また、これは純粋に学術的なものであることに注意する必要があります。これはitertools.combinations
、優れた仕事をし、より幅広い入力(ジェネレーター式を含む)で機能するためです。