【发布时间】:2016-11-22 09:35:53
【问题描述】:
所以我想创建一个函数,它接受正整数 n 并返回一堆 n-tuples,其中填充了 True/False (1/0) 的所有可能组合,用于示例:
f(1) = (0,),(1,)
f(2) = (0, 0), (0, 1), (1, 0), (1, 1)
我的代码是:
def fill(n: int) -> Tuple[Tuple[int]]:
if n == 1:
return (0,),(1,)
return tuple((i + j) for i in fill(n-1) for j in fill(1))
我听说python对递归不是很好,一般觉得这不是有效的解决方案。
似乎使用给定数字范围内的 powerset(powerset 的配方来自 itertools 模块)然后使用某种 Indicator function 就可以了。
from itertools import chain, combinations
def range_powerset(n: int):
s = list(range(n))
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
def indicator(A: Iterable, B: Iterable):
return tuple(i in A for i in B)
def fill2(n: int):
return (indicator(i, range(n)) for i in range_powerset(n))
然而,对于一件非常基本的事情来说,这似乎工作量太大了。 有没有更好的方法?
【问题讨论】:
-
这个问题可能最适合Code Review。
-
致knelwood:究竟什么不是powerset?如果您的意思是主题名称,我选择它是因为没有更好的名称,如果您能提出其他建议,我会很高兴。如果你的意思是我定义了 range_powerset 的函数,它返回的基本上是一个 powerset,这里没有错误。致 jonrsharpe:谢谢提醒,我错过了什么吗?我在那里使用了 powerset 配方,但这并不是我任务的解决方案
标签: python python-3.x combinatorics