2016-05-18 9 views
0

Permute関数を実行していますが、このような結果を得るのに問題が発生していますが、これをどうして防ぐことができますか?Permute関数の繰り返しで問題が発生する

red|red|white 
white|red|red 

Public buffer As New List(Of String) 
Public Sub Permute(ByVal Root As String, ByVal Depth As Integer, ByVal Buffer1 As List(Of String)) 
    Dim data_array As String() = {"red", "blue", "white"} 
    For Each myStr As String In data_array 
     If Depth <= 1 Then 
      Buffer1.Add(Root & myStr) 
     Else 
      Permute(Root & myStr & ",", Depth - 1, Buffer1) 
     End If 
    Next 
End Sub 

答えて

1

Bjørn-Roger Kringsjåthis great answerにVBにはいくつかのC++のコードを変換する際に、このための力仕事をしました。

オリジナルは文字列を置換するために機能します。私はそれを文字列(私が何かをする意味がある)で動作するように変更し、セパレータを指定できるようにしました。 List(Of String())などを返して、String.Joinを呼び出しコードから使用するだけです。

Public NotInheritable Class Permutation 

    Public Shared Function Create(array As String(), sep As String) As List(Of String) 
     Return Permutation.Create(array, False, sep) 
    End Function 

    Public Shared Function Create(array As String(), sort As Boolean, 
            sep As String) 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, sep) 
     If (sort) Then 
      list.Sort() 
     End If 
     Return list 
    End Function 

    Private Shared Sub Permute(list As List(Of String), array As String(), 
           start As Int32, ndx As Int32, sep As String) 
     Permutation.Print(list, array, ndx, sep) 
     If (start < ndx) Then 
      Dim i, j As Integer 
      For i = (ndx - 2) To start Step -1 
       For j = (i + 1) To (ndx - 1) 
        Permutation.Swap(array, i, j) 
        Permutation.Permute(list, array, (i + 1), ndx, sep) 
       Next 
       Permutation.RotateLeft(array, i, ndx) 
      Next 
     End If 
    End Sub 

    Private Shared Sub Print(list As List(Of String), array As String(), 
          size As Int32, sep As String) 
     Dim tmp As New List(Of String) 
     If (array.Length <> 0) Then 
      For i As Integer = 0 To (size - 1) 
       tmp.Add(array(i)) 
      Next 
      list.Add(String.Join(sep, tmp)) 
     End If 
    End Sub 

    Private Shared Sub Swap(array As String(), i As Int32, j As Int32) 
     Dim tmp As String 
     tmp = array(i) 
     array(i) = array(j) 
     array(j) = tmp 
    End Sub 

    Private Shared Sub RotateLeft(array As String(), start As Int32, n As Int32) 
     Dim tmp As String = array(start) 
     For i As Integer = start To (n - 2) 
      array(i) = array(i + 1) 
     Next 
     array(n - 1) = tmp 
    End Sub 
End Class 

注:私の改造者は、クリンクス氏の元のコードを過負荷として混在させてしまいます。用法:

Dim data = {"red", "blue", "white"} 

Dim combos = Permutation.Create(data, ", ") 

結果:

、赤、青、白
、赤、白、青
、青、赤、白
、青、白、赤
、白、赤、青
白、青、赤

0

Whaあなたは、{ "red", "blue", "white" }Depth回のいずれかを選択しています。あなたがPermute("", 5, buffer)と呼ばれるのであれば、あなたは次のようになるだろう:

 
red,red,red,red,red 
red,red,red,red,blue 
... 
white,white,white,white,blue 
white,white,white,white,white 

5つの選択の力に3それ。

Public Function Permute(ByVal data As IEnumerable(Of String)) As IEnumerable(Of String) 
    If data.Skip(1).Any() Then 
     Return data.SelectMany(_ 
      Function (x) Permute(data.Except({ x })).Select(_ 
       Function (y) x & "," & y)) 
    Else 
     Return data 
    End If 
End Function 

...とこのようにそれを呼び出す:あなただけ{ "red", "blue", "white" }のすべての可能な順列を取得したい場合は

これを行うに私が手

Dim results = Permute({ "red", "blue", "white" }) 

結果は以下のとおりです。

 
red,blue,white 
red,white,blue 
blue,red,white 
blue,white,red 
white,red,blue 
white,blue,red 

Rootの値を前に付けるのは簡単ですこれらの結果にe。

関連する問題