这被称为笛卡尔产品。
例如,如果我们有两组A和B,使得
A = {1,2}
B = {3,4}
然后笛卡尔乘积甲X B的结果等于
A x B = {(1,3),(1,4),(2,3),(2,4)}
如果现在我们要在上面得到的结果和新的一组之间做出笛卡尔乘积,例如:
N = {5,6}
结果Ca rtesian产品A X B X N,等于
A x B = {(1,3),(1,4),(2,3),(2,4)}
N = {5,6}
──────────────────────────────────────────────────
A x B x N = {(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)}
所述第一组中的每一个元素都必须与第二组中的每个元素进行配对。
我已经开发了4个解决方案的笛卡尔乘积:
- 使用的数学模型,但没有递归。此解决方案 向量使用计算每个组合数。
- 使用递归和Collections类。
- 使用List(Of ...)类,也用于递归。
这三个解决方案在我看来很难向您解释。 此外,我很难用英语解释我的想法,因为我的母语是卡斯蒂利亚语。
因此,我努力创建另一个不使用递归的解决方案,这对任何程序员来说都更加简单和友好。
最后,我可以创建一个满意的解决方案。易于理解且无递归。 它也非常灵活。根据需要,从2开始接受任意数量的套件。 您也可以使用任意数量的项目。这取决于每个开发人员的要求。
我希望这第四。我设计的解决方案,会取悦你,尊敬的同事。
Form4中只需要一个ListBox1。这里是:
Public Class Form4
Private Sub Form4_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'┌─────────── Temporary code for example ───────────┐
Dim Set_1 As List(Of String) = New List(Of String)
Dim Set_2 As List(Of String) = New List(Of String)
Dim Set_3 As List(Of String) = New List(Of String)
Set_1.Add("1")
Set_1.Add("2")
Set_2.Add("3")
Set_2.Add("4")
Set_3.Add("5")
Set_3.Add("6")
'└──────────────────────────────────────────────────┘
Dim Sets As List(Of Object) = New List(Of Object)
Sets.Add(Set_1)
Sets.Add(Set_2)
Sets.Add(Set_3)
Dim product As List(Of String) = Sets(0)
For i = 1 To Sets.Count - 1
product = CartesianProduct(product, Sets(i))
Next
For Each element As String In product
Me.ListBox1.Items.Add(element)
Next
End Sub
Private Function CartesianProduct(ByVal Set_A As List(Of String), ByVal Set_B As List(Of String)) As List(Of String)
Dim product As List(Of String) = New List(Of String)
For Each a As String In Set_A
For Each b As String In Set_B
product.Add(a & b)
Next
Next
Return product
End Function
End Class
祝您有美好的一天! :)
我发布的算法[这里](http://stackoverflow.com/questions/25326734/cannot-create-algorithm-for-a-sequence-in-vba/25328933#25328933)适用于那和这很容易。它比你的情况更强大(“对”可以是不同大小的集合),所以可能有一个更简单的方法(尽管那个也很短)。 – KekuSemau 2014-10-31 16:39:50