【发布时间】:2019-12-17 17:57:01
【问题描述】:
我应该如何设置一个条件(5 个集合中的 3 个的所有排列。5 个中的任何 2 个,等等。
如果我有:
Me.TextBox1.Text = String.Join(Environment.NewLine, Permutation.Create({"1"c, "2"c, "3"c, "4"c, "5"c}, sort:=False))
输出:(千给我看 5 个中 5 个的排列)。)
12345
12354
12435
12453
12534 and so on...
预期输出:值 = 3(5 个集合中 3 个的所有排列。
123
124
125
and so on...
我应该如何设置这个条件?
Public NotInheritable Class Permutation
Public Shared Function Create(array As Char()) As List(Of String)
Return Permutation.Create(array, False)
End Function
Public Shared Function Create(array As Char(), sort As Boolean) As List(Of String)
If (array Is Nothing) Then
Throw New ArgumentNullException("array")
ElseIf ((array.Length < 0) OrElse (array.Length > 13)) Then
Throw New ArgumentOutOfRangeException("array")
End If
Dim list As New List(Of String)
Dim n As Integer = array.Length
Permutation.Permute(list, array, 0, array.Length)
If (sort) Then
list.Sort()
End If
Return list
End Function
Private Shared Sub Permute(list As List(Of String), array As Char(), start As Integer, n As Integer)
Permutation.Print(list, array, n)
If (start < n) Then
Dim i, j As Integer
For i = (n - 2) To start Step -1
For j = (i + 1) To (n - 1)
Permutation.Swap(array, i, j)
Permutation.Permute(list, array, (i + 1), n)
Next
Permutation.RotateLeft(array, i, n)
Next
End If
End Sub
Private Shared Sub Print(list As List(Of String), array As Char(), size As Integer)
If (array.Length <> 0) Then
Dim s As Char() = New Char(size - 1) {}
For i As Integer = 0 To (size - 1)
s(i) = array(i)
Next
list.Add(s)
End If
End Sub
Private Shared Sub RotateLeft(array As Char(), start As Integer, n As Integer)
Dim tmp As Char = array(start)
For i As Integer = start To (n - 2)
array(i) = array(i + 1)
Next
array(n - 1) = tmp
End Sub
Private Shared Sub Swap(array As Char(), i As Integer, j As Integer)
Dim tmp As Char
tmp = array(i)
array(i) = array(j)
array(j) = tmp
End Sub
End Class
由于Int32.MaxValue 的限制,此类将支持级别 1 到 13。
s=1, n=1
s=2, n=2
s=3, n=6
s=4, n=24
s=5, n=120
s=6, n=720
s=7, n=5040
s=8, n=40320
s=9, n=362880
s=10, n=3628800
s=11, n=39916800
s=12, n=479001600
s=13, n=6227020800
用法:Me.TextBox1.Text = String.Join(Environment.NewLine, Permutation.Create({"c"c, "f"c, "a"c, "m"c}, sort:=False))
【问题讨论】:
-
您是否需要使用您在问题中显示的
Permutation类?如果您不必使用该代码,这似乎可以在几行内实现。 -
我可以试试看会发生什么。 stackoverflow.com/questions/21084651/… - 我使用了这里的所有东西。
标签: vb.net