民间, 我有N个有界集:
S1 = {s11, s12, ... s1a }
S2 = {s21, s22, ... s2b }
...
sN= {sN1, sN2, ... sNx }
我有一个函数f(),它从每个集合中取一个参数A:
f( A1, A2, ... AN ) such that Ax belongs to Sx
我需要为所有可能的参数组合调用f():
f( s11, s21, ... sN1 )
f( s11, s21, ... sN2 )
f( s11, s21, ... sN3 )
...
f( s11, s21, ... sNx )
...
f( s1a, s2b, ... sNx )
有人可以帮我找出一个会触及所有组合的递归(或迭代)算法吗?
提前致谢。
-Raj
答案 0 :(得分:3)
所以基本上你想要生成cartesian product s1 x s2 x ... x sN
。
这是回溯/递归的经典应用。这是伪代码的样子:
function CartesianProduct(current, k)
if (k == N + 1)
current is one possibility, so call f(current[1], current[2], ..., current[N])
and return
for each element e in Sk
call CartesianProduct(current + {e}, k + 1)
Initial call is CartesianProduct({}, 1)
你应该把它写在纸上,看看它是如何工作的。例如,考虑集合:
s1 = {1, 2}
s2 = {3, 4}
s3 = {5, 6}
第一个调用将是CartesianProduct({}, 1)
,然后将开始迭代第一个集合中的元素。因此第一次递归调用是CartesianProduct({1}, 2)
。这将以相同的方式继续,最终达到CartesianProduct({1, 3, 5}, 4)
,终止条件将为真(current.Length == N + 1
)。然后它将回溯并调用CartesianProduct({1, 3, 6}, 4)
,依此类推,直到生成所有可能性。一直在纸上运行,以确切了解它是如何工作的。
一个
额外信用:您能弄明白如何摆脱k
参数吗?