2014-10-31 80 views
0

我需要帮助找出如何去编程这个问题。我有一对未知数。每一对都是长度x宽度。我想从每对中创建长度或宽度的各种可能组合的集合。这里是我想要做的一个例子:vb.net对组合创建所有可能的集合

如果我输入3对,(1x2)(3x4)(5x6)我会得到以下集合: (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对,它将创建总共16组等,我需要能够输入每一对,并且在输入所有对之后,我需要它来打印这些组。它不能在同一组中包含给定对中的两个数字。我如何创建一个循环或者是否有内置的数学函数,可以从给定数量的成对输入中产生所有可能的集合?我希望我能够很好地描述这个问题,但如果没有,请提问。谢谢

+0

我发布的算法[这里](http://stackoverflow.com/questions/25326734/cannot-create-algorithm-for-a-sequence-in-vba/25328933#25328933)适用于那和这很容易。它比你的情况更强大(“对”可以是不同大小的集合),所以可能有一个更简单的方法(尽管那个也很短)。 – KekuSemau 2014-10-31 16:39:50

回答

1

这被称为笛卡尔产品。

例如,如果我们有两组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个解决方案的笛卡尔乘积:

  1. 使用的数学模型,但没有递归。此解决方案 向量使用计算每个组合数。
  2. 使用递归和Collections类。
  3. 使用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 

祝您有美好的一天! :)

+0

非常感谢! – 2014-11-07 15:12:47