我有一些变数,让我们说a,b,c,d。全部属于固定间隔[0,e] 现在我和他们之间有一些关系,比如
a > b
a > c
b > d
像这样的东西;我想制作一个打印所有可能情况的函数。
示例:
a b c d
a c b d
a b d c
a c b d
答案 0 :(得分:2)
从本质上讲,你拥有的是directed acyclic graph。
一种相对简单的方法是为每个变量存储必须之前的一组变量。 (在您的示例中,此存储会将b
映射到{a}
,将c
映射到{a}
,将d
映射到{b}
。)然后,您可以编写一个递归函数,生成由这些变量的子集组成的所有有效尾部(在您的情况下,例如,子集{c,d}
生成两个有效的尾部:[c,d]
和{ {1}})。此递归函数检查子集中的每个变量,并确定是否已满足其先决条件。 (例如,由于[d,c]
映射到b
,因此包含{a}
和a
的任何子集都无法生成以b
开头的尾部。)如果是,那么它可以递归地在不包括该变量的子集上调用自己。
如果需要,您可以执行一些优化。例如,您可以使用dynamic programming来避免重复计算同一子集的有效尾部集。