帮助我使用这种递归组合算法

时间:2011-01-02 01:11:47

标签: algorithm recursion pseudocode

民间, 我有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

1 个答案:

答案 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参数吗?