2014-10-31 76 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